当前位置:   article > 正文

大一下 数据结构 清华严蔚敏(C语言)版 学习记录——树和二叉树_数据结构一课一文

数据结构一课一文

基础知识点:

1、结点拥有的子树称为结点的度;

2、度为0的结点称为叶子或终端结点,度不为0的结点称为非终端结点或分支结点;

3、树的度是树内各结点的度的最大值;

4、同一个双亲的孩子之间互称兄弟;

5、结点的祖先是从根到该结点所经分支上的所有结点,子孙的定义反之;

6、结点的层次从根开始定义起,根为第一层,根的孩子为第二层;

7、其双亲在同一层的结点互为堂兄弟;

8、树中结点的最大层次称为树的深度或高度;

9、如果将树中结点的各子树看成从左至右是有次序的(即不能互换),

     则称该树为有序树,否则为无序树;

10、二叉树不是特殊的一种树!!!

11、n0 = n2+1;

12、完全二叉树和满二叉树是两种特殊形态的树;

13、二叉树的四个性质;

14、哈夫曼树的建立、求WPL值、求哈夫曼编码;

15、哈夫曼编码的长度不是唯一的;

按先序遍历的顺序建立二叉树,

然后输出每个结点和它在树中的深度

Sample Input:

        ABD##E##C##

Sample Output:

        A(1)B(2)D(3)E(3)C(2)

  1. #include<bits/stdc++.h>
  2. #define MAX_TREE_SIZE 100//二叉树的最大结点数
  3. #define OK 1
  4. #define OVERFLOW -2
  5. #define ERROR 0
  6. //typedef TElemType SqBiTree[MAX_TREE_SIZE];//0号单元存储根节点
  7. //SqBiTree bt;
  8. //typedef int TElemType;
  9. typedef char TElemType;
  10. typedef int Status;
  11. /* typedef struct BiTNode{//二叉树的结点
  12. TElemType data;
  13. struct BiTNode *lchild,*rchild;//左右孩子指针
  14. }BiTNode,*BiTree; */
  15. typedef struct BiTNode{
  16. TElemType data;
  17. struct BiTNode *lchild,*rchild,*parent;
  18. int deep;//结点的深度
  19. }BiTNode,*BiTree;
  20. typedef enum PointerTag{Link,Thread};//定义一个枚举类型
  21. typedef struct BiThrNode{//线索二叉树的结点
  22. TElemType data;
  23. struct BiThrNode *lchild,*rchild;//左右指针
  24. PointerTag LTag,RTag;//左右标志
  25. }BiThrNode,*BiThrTree;
  26. typedef struct BPTNode{
  27. TElemType data;
  28. int parent;
  29. char LRTag;
  30. }BPTNode;
  31. typedef struct BPTree{
  32. BPTNode nodes[MAX_TREE_SIZE];
  33. int num_node;
  34. int root;
  35. }BPTree;
  36. Status PrintElement(TElemType e)
  37. { //最简单的Visit()函数
  38. //调用实例:PreOrderTraverse(T,PrintElement)
  39. printf("%d ",e);
  40. return OK;
  41. }
  42. Status Visit(TElemType e)
  43. {
  44. printf("%c",e);
  45. return OK;
  46. }
  47. Status CreatBiTree(BiTree &T)//按先序次序构建二叉树
  48. {
  49. TElemType ch;
  50. scanf("%c",&ch);
  51. if(ch=='#'||ch=='\n') T=NULL;
  52. else{
  53. if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
  54. T->data=ch;
  55. CreatBiTree(T->lchild);
  56. CreatBiTree(T->rchild);
  57. }
  58. /* if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
  59. T->data=ch;//生成根据结点
  60. CreatBiTree(T->lchild);//构造左子树
  61. CreatBiTree(T->rchild);//构造右子树 */
  62. return OK;
  63. }
  64. Status CreatBiTree_depth(BiTree &T,int d)//按先序次序构建二叉树,并定义计算每个结点的深度
  65. {
  66. TElemType ch;
  67. scanf("%c",&ch);
  68. if(ch=='#'||ch=='\n') T=NULL;
  69. else{
  70. if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
  71. T->data=ch;T->deep=d;
  72. CreatBiTree_depth(T->lchild,d+1);
  73. CreatBiTree_depth(T->rchild,d+1);
  74. }
  75. /* if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
  76. T->data=ch;//生成根据结点
  77. CreatBiTree(T->lchild);//构造左子树
  78. CreatBiTree(T->rchild);//构造右子树 */
  79. return OK;
  80. }
  81. Status BitreeDepth(BiTree T)//求二叉树的深度
  82. {
  83. int depth,ldepth,rdepth;
  84. if(T==NULL) depth=0;
  85. else{
  86. ldepth=BitreeDepth(T->lchild);
  87. rdepth=BitreeDepth(T->rchild);
  88. depth=1+(ldepth>rdepth?ldepth:rdepth);
  89. }
  90. return depth;
  91. }
  92. /* Status PreOrderTraverse(BiTree T.Status(*Visit)(TElemType e))//先序遍历的递归算法
  93. { //Visit()是对结点操作的应用函数
  94. if(T)
  95. {
  96. if(Visit(T->data))
  97. if(PreOrderTraverse(T->lchild.Visit))
  98. if(PreOrderTraverse(T->rchild.Visit)) return OK;
  99. return ERROR;
  100. }else return OK;
  101. } */
  102. /* Status InOrderTraverse(BiTree T,Status(*Visit)(TElemType e))//中序遍历的非递归算法
  103. {
  104. InitStack(S);Push(S,T);//根指针进栈
  105. while(!StackEmpty(S))
  106. {
  107. while(GetTop(S.p)&&p)
  108. {
  109. Push(S.p->lchild);//向左走到尽头
  110. }
  111. Pop(S.p);//空指针出栈
  112. if(!StackEmpty(S))
  113. {
  114. Pop(S.p);
  115. if(!Visit(p->data)) return ERROR;
  116. Push(S.p->rchild);
  117. }
  118. }
  119. return OK;
  120. } */
  121. /* Status InOrderTraverse(BiTree T.Status(*Visit)(TElemType e))
  122. {
  123. InitStack(S);p=T;
  124. while(p||StackEmpty(S))
  125. {
  126. if(p){
  127. Push(S,p);
  128. p=p->lchild;
  129. }else{
  130. Pop(S,p);
  131. if(!Visit(p->data)) return ERROR;
  132. p=p->rchild;
  133. }
  134. }
  135. return OK;
  136. } */
  137. /* BiTNode*GoFarLeft(BiTree ,Stack *S)//找最左边最远的结点
  138. {
  139. if(!T) return NULL;
  140. while(T->lchild)
  141. {
  142. Push(S,T);
  143. T=T->lchild;
  144. }
  145. return T;
  146. } */
  147. /* void InorderTree(BiTree T,void(*Visit)(TElemType &e))//更清晰的中序遍历的非递归算法
  148. {
  149. Stack *S;BiTree t,p;p=T->lchild;
  150. t=GoFarLeft(p,S);
  151. while(t)
  152. {
  153. visit(t->data);
  154. if(t->rchild) t=GoFarLeft(t->rchild,S);
  155. else if(!StackEmpty(S)) t=Pop(S);
  156. else t=NULL;
  157. }
  158. } */
  159. Status InOrderTraverse_Thr(BiThrTree T,Status(*Visit)(TElemType e))//以双向线索链表为存储结构时对二叉树进行遍历的算法
  160. {
  161. BiThrNode *p;
  162. p=T->lchild;//p指向根节点
  163. while(p!=T)
  164. {
  165. while(p->LTag==Link) p=p->lchild;
  166. if(!Visit(p->data)) return ERROR;
  167. while(p->RTag==Thread&&p->rchild!=T)
  168. {
  169. p=p->rchild;Visit(p->data);//访问后继结点
  170. }
  171. p=p->rchild;
  172. }
  173. return OK;
  174. }
  175. void InThreading(BiThrTree p)//二叉树先线索化函数
  176. {
  177. BiThrNode *pre;
  178. if(p)
  179. {
  180. InThreading(p->lchild);//左子树线索化
  181. if(!p->lchild)//前驱线索
  182. {
  183. p->LTag=Thread;
  184. p->lchild=pre;
  185. }
  186. if(!pre->rchild)//后继线索
  187. {
  188. pre->RTag=Thread;
  189. p->lchild=p;
  190. }
  191. pre=p;//保持pre指向p的前驱
  192. InThreading(p->rchild);//右子树线索化
  193. }
  194. }
  195. Status InorderThreading(BiThrTree&Thrt,BiThrTree T)//遍历线索化链表
  196. {
  197. BiThrNode *pre;
  198. if(!(Thrt=(BiThrTree)malloc(sizeof(BiThrNode)))) exit(OVERFLOW);
  199. Thrt->LTag=Link;Thrt->RTag=Thread;
  200. Thrt->rchild=Thrt;
  201. if(!T) Thrt->lchild=Thrt;
  202. else{
  203. Thrt->lchild=T;pre=Thrt;
  204. InThreading(T);
  205. pre->rchild=Thrt;pre->RTag=Thread;
  206. Thrt->rchild=pre;
  207. }
  208. return OK;
  209. }
  210. Status PreOrderTraversal(BiTree T)//先序遍历的递归算法
  211. {
  212. if(T)
  213. {
  214. printf("%c(%d)",T->data,T->deep);
  215. PreOrderTraversal(T->lchild);
  216. PreOrderTraversal(T->rchild);
  217. }
  218. return OK;
  219. }
  220. Status InOrderTraversal(BiTree T)
  221. {
  222. if(T)
  223. {
  224. InOrderTraversal(T->lchild);
  225. Visit(T->data);
  226. InOrderTraversal(T->rchild);
  227. }
  228. return OK;
  229. }
  230. Status PostOrderTraversal(BiTree T)
  231. {
  232. if(T)
  233. {
  234. PostOrderTraversal(T->lchild);
  235. PostOrderTraversal(T->rchild);
  236. Visit(T->data);
  237. }
  238. return OK;
  239. }
  240. void CountLeaf(BiThrTree T,int &count)//统计叶子结点个数
  241. {
  242. if(T)
  243. {
  244. if((!T->lchild)&&(!T->rchild)) count++;
  245. CountLeaf(T->lchild,count);
  246. CountLeaf(T->rchild,count);
  247. }
  248. }
  249. Status BitreeLeafCount(BiTree T)//统计叶子结点个数
  250. {
  251. if(T==NULL) return 0;
  252. else{
  253. if(T->lchild==NULL&&T->rchild==NULL) return 1;
  254. else return BitreeLeafCount(T->lchild)+BitreeLeafCount(T->rchild);
  255. }
  256. }
  257. Status BitreeCount(BiTree T)//求结点个数
  258. {
  259. if(T==NULL) return 0;
  260. else return BitreeCount(T->lchild)+BitreeCount(T->rchild);
  261. }
  262. Status ChangeNode(BiTree bt)//交换左右子树
  263. {
  264. BiTNode*temp;
  265. if(bt==NULL) return 0;
  266. ChangeNode(bt->lchild);
  267. ChangeNode(bt->rchild);
  268. temp=bt->lchild;
  269. bt->lchild=bt->rchild;
  270. bt->rchild=temp;
  271. }
  272. int main(){
  273. BiTree T;
  274. CreatBiTree_depth(T,1);
  275. PreOrderTraversal(T);
  276. return 0;
  277. }

由先序遍历和中序遍历序列建立二叉树,

然后输出该二叉树的后序序列

Sample Input:

        abdcef dbaecf

Hint:

        dbefca

  1. #include<bits/stdc++.h>
  2. #define MAX_TREE_SIZE 100//二叉树的最大结点数
  3. #define OK 1
  4. #define OVERFLOW -2
  5. #define ERROR 0
  6. using namespace std;
  7. //typedef TElemType SqBiTree[MAX_TREE_SIZE];//0号单元存储根节点
  8. //SqBiTree bt;
  9. //typedef int TElemType;
  10. typedef char TElemType;
  11. typedef int Status;
  12. /* typedef struct BiTNode{//二叉树的结点
  13. TElemType data;
  14. struct BiTNode *lchild,*rchild;//左右孩子指针
  15. }BiTNode,*BiTree; */
  16. typedef struct BiTNode{
  17. TElemType data;
  18. struct BiTNode *lchild,*rchild,*parent;
  19. int deep;//结点的深度
  20. }BiTNode,*BiTree;
  21. typedef enum PointerTag{Link,Thread};//定义一个枚举类型
  22. typedef struct BiThrNode{//线索二叉树的结点
  23. TElemType data;
  24. struct BiThrNode *lchild,*rchild;//左右指针
  25. PointerTag LTag,RTag;//左右标志
  26. }BiThrNode,*BiThrTree;
  27. typedef struct BPTNode{
  28. TElemType data;
  29. int parent;
  30. char LRTag;
  31. }BPTNode;
  32. typedef struct BPTree{
  33. BPTNode nodes[MAX_TREE_SIZE];
  34. int num_node;
  35. int root;
  36. }BPTree;
  37. Status PrintElement(TElemType e)
  38. { //最简单的Visit()函数
  39. //调用实例:PreOrderTraverse(T,PrintElement)
  40. printf("%d ",e);
  41. return OK;
  42. }
  43. Status Visit(TElemType e)
  44. {
  45. printf("%c",e);
  46. return OK;
  47. }
  48. Status CreatBiTree(BiTree &T)//按先序次序构建二叉树
  49. {
  50. TElemType ch;
  51. scanf("%c",&ch);
  52. if(ch=='#'||ch=='\n') T=NULL;
  53. else{
  54. if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
  55. T->data=ch;
  56. CreatBiTree(T->lchild);
  57. CreatBiTree(T->rchild);
  58. }
  59. /* if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
  60. T->data=ch;//生成根据结点
  61. CreatBiTree(T->lchild);//构造左子树
  62. CreatBiTree(T->rchild);//构造右子树 */
  63. return OK;
  64. }
  65. Status CreatBiTree_depth(BiTree &T,int d)//按先序次序构建二叉树,并定义计算每个结点的深度
  66. {
  67. TElemType ch;
  68. scanf("%c",&ch);
  69. if(ch=='#'||ch=='\n') T=NULL;
  70. else{
  71. if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
  72. T->data=ch;T->deep=d;
  73. CreatBiTree_depth(T->lchild,d+1);
  74. CreatBiTree_depth(T->rchild,d+1);
  75. }
  76. /* if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
  77. T->data=ch;//生成根据结点
  78. CreatBiTree(T->lchild);//构造左子树
  79. CreatBiTree(T->rchild);//构造右子树 */
  80. return OK;
  81. }
  82. void CreatBiTreeP_I(char *pre,char *in,int n)//由先序遍历和中序遍历序列建立二叉树
  83. {
  84. if(n<=0) return ;
  85. int len=strchr(in,pre[0])-in;
  86. CreatBiTreeP_I(pre+1,in,len);
  87. CreatBiTreeP_I(pre+len+1,in+len+1,n-len-1);
  88. printf("%c",pre[0]);
  89. }
  90. Status BitreeDepth(BiTree T)//求二叉树的深度
  91. {
  92. int depth,ldepth,rdepth;
  93. if(T==NULL) depth=0;
  94. else{
  95. ldepth=BitreeDepth(T->lchild);
  96. rdepth=BitreeDepth(T->rchild);
  97. depth=1+(ldepth>rdepth?ldepth:rdepth);
  98. }
  99. return depth;
  100. }
  101. /* Status PreOrderTraverse(BiTree T.Status(*Visit)(TElemType e))//先序遍历的递归算法
  102. { //Visit()是对结点操作的应用函数
  103. if(T)
  104. {
  105. if(Visit(T->data))
  106. if(PreOrderTraverse(T->lchild.Visit))
  107. if(PreOrderTraverse(T->rchild.Visit)) return OK;
  108. return ERROR;
  109. }else return OK;
  110. } */
  111. /* Status InOrderTraverse(BiTree T,Status(*Visit)(TElemType e))//中序遍历的非递归算法
  112. {
  113. InitStack(S);Push(S,T);//根指针进栈
  114. while(!StackEmpty(S))
  115. {
  116. while(GetTop(S.p)&&p)
  117. {
  118. Push(S.p->lchild);//向左走到尽头
  119. }
  120. Pop(S.p);//空指针出栈
  121. if(!StackEmpty(S))
  122. {
  123. Pop(S.p);
  124. if(!Visit(p->data)) return ERROR;
  125. Push(S.p->rchild);
  126. }
  127. }
  128. return OK;
  129. } */
  130. /* Status InOrderTraverse(BiTree T.Status(*Visit)(TElemType e))
  131. {
  132. InitStack(S);p=T;
  133. while(p||StackEmpty(S))
  134. {
  135. if(p){
  136. Push(S,p);
  137. p=p->lchild;
  138. }else{
  139. Pop(S,p);
  140. if(!Visit(p->data)) return ERROR;
  141. p=p->rchild;
  142. }
  143. }
  144. return OK;
  145. } */
  146. /* BiTNode*GoFarLeft(BiTree ,Stack *S)//找最左边最远的结点
  147. {
  148. if(!T) return NULL;
  149. while(T->lchild)
  150. {
  151. Push(S,T);
  152. T=T->lchild;
  153. }
  154. return T;
  155. } */
  156. /* void InorderTree(BiTree T,void(*Visit)(TElemType &e))//更清晰的中序遍历的非递归算法
  157. {
  158. Stack *S;BiTree t,p;p=T->lchild;
  159. t=GoFarLeft(p,S);
  160. while(t)
  161. {
  162. visit(t->data);
  163. if(t->rchild) t=GoFarLeft(t->rchild,S);
  164. else if(!StackEmpty(S)) t=Pop(S);
  165. else t=NULL;
  166. }
  167. } */
  168. Status InOrderTraverse_Thr(BiThrTree T,Status(*Visit)(TElemType e))//以双向线索链表为存储结构时对二叉树进行遍历的算法
  169. {
  170. BiThrNode *p;
  171. p=T->lchild;//p指向根节点
  172. while(p!=T)
  173. {
  174. while(p->LTag==Link) p=p->lchild;
  175. if(!Visit(p->data)) return ERROR;
  176. while(p->RTag==Thread&&p->rchild!=T)
  177. {
  178. p=p->rchild;Visit(p->data);//访问后继结点
  179. }
  180. p=p->rchild;
  181. }
  182. return OK;
  183. }
  184. void InThreading(BiThrTree p)//二叉树先线索化函数
  185. {
  186. BiThrNode *pre;
  187. if(p)
  188. {
  189. InThreading(p->lchild);//左子树线索化
  190. if(!p->lchild)//前驱线索
  191. {
  192. p->LTag=Thread;
  193. p->lchild=pre;
  194. }
  195. if(!pre->rchild)//后继线索
  196. {
  197. pre->RTag=Thread;
  198. p->lchild=p;
  199. }
  200. pre=p;//保持pre指向p的前驱
  201. InThreading(p->rchild);//右子树线索化
  202. }
  203. }
  204. Status InorderThreading(BiThrTree&Thrt,BiThrTree T)//遍历线索化链表
  205. {
  206. BiThrNode *pre;
  207. if(!(Thrt=(BiThrTree)malloc(sizeof(BiThrNode)))) exit(OVERFLOW);
  208. Thrt->LTag=Link;Thrt->RTag=Thread;
  209. Thrt->rchild=Thrt;
  210. if(!T) Thrt->lchild=Thrt;
  211. else{
  212. Thrt->lchild=T;pre=Thrt;
  213. InThreading(T);
  214. pre->rchild=Thrt;pre->RTag=Thread;
  215. Thrt->rchild=pre;
  216. }
  217. return OK;
  218. }
  219. Status PreOrderTraversal(BiTree T)//先序遍历的递归算法
  220. {
  221. if(T)
  222. {
  223. printf("%c(%d)",T->data,T->deep);
  224. PreOrderTraversal(T->lchild);
  225. PreOrderTraversal(T->rchild);
  226. }
  227. return OK;
  228. }
  229. Status InOrderTraversal(BiTree T)
  230. {
  231. if(T)
  232. {
  233. InOrderTraversal(T->lchild);
  234. Visit(T->data);
  235. InOrderTraversal(T->rchild);
  236. }
  237. return OK;
  238. }
  239. Status PostOrderTraversal(BiTree T)
  240. {
  241. if(T)
  242. {
  243. PostOrderTraversal(T->lchild);
  244. PostOrderTraversal(T->rchild);
  245. Visit(T->data);
  246. }
  247. return OK;
  248. }
  249. void CountLeaf(BiThrTree T,int &count)//统计叶子结点个数
  250. {
  251. if(T)
  252. {
  253. if((!T->lchild)&&(!T->rchild)) count++;
  254. CountLeaf(T->lchild,count);
  255. CountLeaf(T->rchild,count);
  256. }
  257. }
  258. Status BitreeLeafCount(BiTree T)//统计叶子结点个数
  259. {
  260. if(T==NULL) return 0;
  261. else{
  262. if(T->lchild==NULL&&T->rchild==NULL) return 1;
  263. else return BitreeLeafCount(T->lchild)+BitreeLeafCount(T->rchild);
  264. }
  265. }
  266. Status BitreeCount(BiTree T)//求结点个数
  267. {
  268. if(T==NULL) return 0;
  269. else return BitreeCount(T->lchild)+BitreeCount(T->rchild);
  270. }
  271. Status ChangeNode(BiTree bt)//交换左右子树
  272. {
  273. BiTNode*temp;
  274. if(bt==NULL) return 0;
  275. ChangeNode(bt->lchild);
  276. ChangeNode(bt->rchild);
  277. temp=bt->lchild;
  278. bt->lchild=bt->rchild;
  279. bt->rchild=temp;
  280. }
  281. char a[100005],b[100005];
  282. int main(){
  283. while(~scanf("%s%s",a,b))
  284. {
  285. CreatBiTreeP_I(a,b,strlen(a));
  286. printf("\n");
  287. }
  288. return 0;
  289. }

建立中序线索二叉树

并按中序遍历该二叉树

Sample Input:

        ABD##E##C##

Sample Output:

        DBEAC

  1. #include<bits/stdc++.h>
  2. #define MAX_TREE_SIZE 100//二叉树的最大结点数
  3. #define OK 1
  4. #define OVERFLOW -2
  5. #define ERROR 0
  6. using namespace std;
  7. //typedef TElemType SqBiTree[MAX_TREE_SIZE];//0号单元存储根节点
  8. //SqBiTree bt;
  9. //typedef int TElemType;
  10. typedef char TElemType;
  11. typedef int Status;
  12. /* typedef struct BiTNode{//二叉树的结点
  13. TElemType data;
  14. struct BiTNode *lchild,*rchild;//左右孩子指针
  15. }BiTNode,*BiTree; */
  16. typedef struct BiTNode{//二叉树的结点
  17. TElemType data;
  18. struct BiTNode *lchild,*rchild,*parent;
  19. int deep;//结点的深度
  20. }BiTNode,*BiTree;
  21. typedef enum PointerTag{Link,Thread};//定义一个枚举类型
  22. typedef struct BiThrNode{//线索二叉树的结点
  23. TElemType data;
  24. struct BiThrNode *lchild,*rchild;//左右指针
  25. PointerTag LTag,RTag;//左右标志
  26. }BiThrNode,*BiThrTree;
  27. typedef struct BPTNode{
  28. TElemType data;
  29. int parent;
  30. char LRTag;
  31. }BPTNode;
  32. typedef struct BPTree{
  33. BPTNode nodes[MAX_TREE_SIZE];
  34. int num_node;
  35. int root;
  36. }BPTree;
  37. Status PrintElement(TElemType e)
  38. { //最简单的Visit()函数
  39. //调用实例:PreOrderTraverse(T,PrintElement)
  40. printf("%d ",e);
  41. return OK;
  42. }
  43. Status Visit(TElemType e)
  44. {
  45. printf("%c",e);
  46. return OK;
  47. }
  48. Status CreatBiTree(BiTree &T)//按先序次序构建二叉树
  49. {
  50. TElemType ch;
  51. scanf("%c",&ch);
  52. if(ch=='#'||ch=='\n') T=NULL;
  53. else{
  54. if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
  55. T->data=ch;
  56. CreatBiTree(T->lchild);
  57. CreatBiTree(T->rchild);
  58. }
  59. /* if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
  60. T->data=ch;//生成根据结点
  61. CreatBiTree(T->lchild);//构造左子树
  62. CreatBiTree(T->rchild);//构造右子树 */
  63. return OK;
  64. }
  65. Status CreatBiTree_depth(BiTree &T,int d)//按先序次序构建二叉树,并定义计算每个结点的深度
  66. {
  67. TElemType ch;
  68. scanf("%c",&ch);
  69. if(ch=='#'||ch=='\n') T=NULL;
  70. else{
  71. if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
  72. T->data=ch;T->deep=d;
  73. CreatBiTree_depth(T->lchild,d+1);
  74. CreatBiTree_depth(T->rchild,d+1);
  75. }
  76. /* if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
  77. T->data=ch;//生成根据结点
  78. CreatBiTree(T->lchild);//构造左子树
  79. CreatBiTree(T->rchild);//构造右子树 */
  80. return OK;
  81. }
  82. void CreatBiTreeP_I(char *pre,char *in,int n)//由先序遍历和中序遍历序列建立二叉树
  83. {
  84. if(n<=0) return ;
  85. int len=strchr(in,pre[0])-in;
  86. CreatBiTreeP_I(pre+1,in,len);
  87. CreatBiTreeP_I(pre+len+1,in+len+1,n-len-1);
  88. printf("%c",pre[0]);
  89. }
  90. void Creat_BiThrTree(BiThrNode* &T)//按照先序序列构造线索二叉树
  91. {
  92. char ch;scanf("%c",&ch);
  93. if(ch=='#'||ch=='\n') T=NULL;
  94. else{
  95. T=(BiThrNode*)malloc(sizeof(BiThrNode));
  96. if(!T) exit(OVERFLOW);
  97. T->data=ch;//生成根结点
  98. Creat_BiThrTree(T->lchild);//递归构造左子树
  99. if(T->lchild) T->LTag=Link;//有左孩子
  100. Creat_BiThrTree(T->rchild);//递归构造右子树
  101. if(T->rchild) T->RTag=Link;//有右孩子
  102. }
  103. }
  104. Status BitreeDepth(BiTree T)//求二叉树的深度
  105. {
  106. int depth,ldepth,rdepth;
  107. if(T==NULL) depth=0;
  108. else{
  109. ldepth=BitreeDepth(T->lchild);
  110. rdepth=BitreeDepth(T->rchild);
  111. depth=1+(ldepth>rdepth?ldepth:rdepth);
  112. }
  113. return depth;
  114. }
  115. /* Status PreOrderTraverse(BiTree T.Status(*Visit)(TElemType e))//先序遍历的递归算法
  116. { //Visit()是对结点操作的应用函数
  117. if(T)
  118. {
  119. if(Visit(T->data))
  120. if(PreOrderTraverse(T->lchild.Visit))
  121. if(PreOrderTraverse(T->rchild.Visit)) return OK;
  122. return ERROR;
  123. }else return OK;
  124. } */
  125. /* Status InOrderTraverse(BiTree T,Status(*Visit)(TElemType e))//中序遍历的非递归算法
  126. {
  127. InitStack(S);Push(S,T);//根指针进栈
  128. while(!StackEmpty(S))
  129. {
  130. while(GetTop(S.p)&&p)
  131. {
  132. Push(S.p->lchild);//向左走到尽头
  133. }
  134. Pop(S.p);//空指针出栈
  135. if(!StackEmpty(S))
  136. {
  137. Pop(S.p);
  138. if(!Visit(p->data)) return ERROR;
  139. Push(S.p->rchild);
  140. }
  141. }
  142. return OK;
  143. } */
  144. void ThInOrder(BiThrNode*T)//中序遍历线索二叉树的非递归算法
  145. {
  146. BiThrNode *p=T->lchild;//p指向根结点
  147. while(p!=T)
  148. {
  149. while(p->LTag==Link)
  150. {
  151. p=p->lchild;//找开始结点
  152. }
  153. printf("%c",p->data);//访问开始结点
  154. while(p->RTag==Thread&&p->rchild!=T)
  155. {
  156. p=p->rchild;
  157. printf("%c",p->data);
  158. }
  159. p=p->rchild;
  160. }
  161. }
  162. /* BiTNode*GoFarLeft(BiTree ,Stack *S)//找最左边最远的结点
  163. {
  164. if(!T) return NULL;
  165. while(T->lchild)
  166. {
  167. Push(S,T);
  168. T=T->lchild;
  169. }
  170. return T;
  171. } */
  172. /* void InorderTree(BiTree T,void(*Visit)(TElemType &e))//更清晰的中序遍历的非递归算法
  173. {
  174. Stack *S;BiTree t,p;p=T->lchild;
  175. t=GoFarLeft(p,S);
  176. while(t)
  177. {
  178. visit(t->data);
  179. if(t->rchild) t=GoFarLeft(t->rchild,S);
  180. else if(!StackEmpty(S)) t=Pop(S);
  181. else t=NULL;
  182. }
  183. } */
  184. Status InOrderTraverse_Thr(BiThrTree T,Status(*Visit)(TElemType e))//以双向线索链表为存储结构时对二叉树进行遍历的算法
  185. {
  186. BiThrNode *p;
  187. p=T->lchild;//p指向根节点
  188. while(p!=T)
  189. {
  190. while(p->LTag==Link) p=p->lchild;
  191. if(!Visit(p->data)) return ERROR;
  192. while(p->RTag==Thread&&p->rchild!=T)
  193. {
  194. p=p->rchild;Visit(p->data);//访问后继结点
  195. }
  196. p=p->rchild;
  197. }
  198. return OK;
  199. }
  200. BiThrNode *pre;//全局变量,始终指向刚刚访问过的结点
  201. void InThreading(BiThrNode* &p)//中序遍历并进行中序线索化
  202. {
  203. if(p!=NULL)
  204. {
  205. InThreading(p->lchild);//左子树线索化
  206. if(p->lchild==NULL)//前驱线索
  207. {
  208. p->lchild=pre;
  209. p->LTag=Thread;
  210. }else p->LTag=Link;
  211. if(pre->rchild==NULL)//后继线索
  212. {
  213. pre->rchild=p;
  214. pre->RTag=Thread;
  215. }else pre->RTag=Link;
  216. pre=p;//保持pre指向p的前驱
  217. InThreading(p->rchild);//右子树线索化
  218. }
  219. }
  220. BiThrNode*Creat_BiThrTree_Thread(BiThrNode* &T)//中序遍历二叉树T,并将其中序线索化,root指向头结点
  221. {
  222. BiThrNode*root;
  223. root=(BiThrNode*)malloc(sizeof(BiThrNode));
  224. if(!root) exit(OVERFLOW);
  225. root->LTag=Link;
  226. root->RTag=Thread;
  227. root->rchild=root;
  228. if(T==NULL) root->lchild=root;
  229. else{
  230. root->lchild=T;
  231. pre=root;
  232. InThreading(T);
  233. pre->rchild=root;
  234. pre->RTag=Thread;
  235. root->rchild=pre;
  236. }
  237. return root;
  238. }
  239. Status InorderThreading(BiThrTree&Thrt,BiThrTree T)//中序遍历线索化链表
  240. {
  241. BiThrNode *pre;
  242. if(!(Thrt=(BiThrTree)malloc(sizeof(BiThrNode)))) exit(OVERFLOW);
  243. Thrt->LTag=Link;Thrt->RTag=Thread;
  244. Thrt->rchild=Thrt;
  245. if(!T) Thrt->lchild=Thrt;
  246. else{
  247. Thrt->lchild=T;pre=Thrt;
  248. InThreading(T);
  249. pre->rchild=Thrt;pre->RTag=Thread;
  250. Thrt->rchild=pre;
  251. }
  252. return OK;
  253. }
  254. Status PreOrderTraversal(BiTree T)//先序遍历的递归算法
  255. {
  256. if(T)
  257. {
  258. printf("%c(%d)",T->data,T->deep);
  259. PreOrderTraversal(T->lchild);
  260. PreOrderTraversal(T->rchild);
  261. }
  262. return OK;
  263. }
  264. Status InOrderTraversal(BiTree T)
  265. {
  266. if(T)
  267. {
  268. InOrderTraversal(T->lchild);
  269. Visit(T->data);
  270. InOrderTraversal(T->rchild);
  271. }
  272. return OK;
  273. }
  274. Status PostOrderTraversal(BiTree T)
  275. {
  276. if(T)
  277. {
  278. PostOrderTraversal(T->lchild);
  279. PostOrderTraversal(T->rchild);
  280. Visit(T->data);
  281. }
  282. return OK;
  283. }
  284. void CountLeaf(BiThrTree T,int &count)//统计叶子结点个数
  285. {
  286. if(T)
  287. {
  288. if((!T->lchild)&&(!T->rchild)) count++;
  289. CountLeaf(T->lchild,count);
  290. CountLeaf(T->rchild,count);
  291. }
  292. }
  293. Status BitreeLeafCount(BiTree T)//统计叶子结点个数
  294. {
  295. if(T==NULL) return 0;
  296. else{
  297. if(T->lchild==NULL&&T->rchild==NULL) return 1;
  298. else return BitreeLeafCount(T->lchild)+BitreeLeafCount(T->rchild);
  299. }
  300. }
  301. Status BitreeCount(BiTree T)//求结点个数
  302. {
  303. if(T==NULL) return 0;
  304. else return BitreeCount(T->lchild)+BitreeCount(T->rchild);
  305. }
  306. Status ChangeNode(BiTree bt)//交换左右子树
  307. {
  308. BiTNode*temp;
  309. if(bt==NULL) return 0;
  310. ChangeNode(bt->lchild);
  311. ChangeNode(bt->rchild);
  312. temp=bt->lchild;
  313. bt->lchild=bt->rchild;
  314. bt->rchild=temp;
  315. }
  316. /* void AllPath(BiTree T,Stack &S)//输出二叉树上从根到所有叶子结点的路径
  317. {
  318. if(T)
  319. {
  320. Push(S,T->data);
  321. if(!T->lchild&&!T->rchild) PrintStack(S);
  322. else{
  323. AllPath(T->lchild,S);
  324. AllPath(T->rchild,S);
  325. }
  326. Pop(S);
  327. }
  328. } */
  329. /* void OutPath(BiTree T,Stack&S)//输出树中所有从跟到叶的路径
  330. {
  331. while(T)
  332. {
  333. Push(S,T->data);
  334. if(!T->firstchild) Printstack(S);
  335. else OutPath(T->first,S);
  336. Pop(S);
  337. T=T->nextsibling;
  338. }
  339. } */
  340. int main(){
  341. BiThrNode *root,*b;
  342. Creat_BiThrTree(b);
  343. root=Creat_BiThrTree_Thread(b);
  344. ThInOrder(root);
  345. return 0;
  346. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/592545
推荐阅读
相关标签
  

闽ICP备14008679号