二叉树使用链做结构,其结构体有存储数据的变量和指向左右孩子的指针
1 typedef char elemtype; 2 3 typedef struct BiTreeNode{ 4 elemtype date; 5 struct BiTreeNode *lchild; 6 struct BiTreeNode *rchild; 7 }BiTreeNode, *BiTree;
二叉树的一般遍历方法(假设先左子树再右子树)有3个,根节点作为访问的先后条件。
1 //后序遍历 2 void postOrd(BiTree biTree){ 3 4 if(biTree!=NULL){ 5 postOrd(biTree->lchild); 6 postOrd(biTree->lchild); 7 printf("%c",biTree->date); 8 return ; 9 } 10 return ; 11 12 } 13 14 //中序遍历 15 void inOrd(BiTree biTree){ 16 17 if(biTree!=NULL){ 18 inOrd(biTree->lchild); 19 printf("%c",biTree->date); 20 inOrd(biTree->rchild); 21 return ; 22 } 23 return ; 24 25 } 26 27 //前序遍历 28 void preOrd(BiTree biTree){ 29 30 if(biTree!=NULL){ 31 printf("%c",biTree->date); 32 preOrd(biTree->lchild); 33 preOrd(biTree->rchild); 34 return ; 35 } 36 return ; 37 }
结合先序和中序遍历序列创建二叉树:
设先序遍历序列和中序遍历序列分别为"ABCDEFG"、"CBDAEGF",分别对应1式和2式。从2式开头找一个字符与1式的第一个字符相同的字符A,把2式中A左右两边分为左子树和右子树,根据2式的左右子树再把1式分为左右子树,即两式的左右子树内容要相同。1式分为1.1(左BCD)和1.2(右EFG)两式,2式分为2.1(左CBD)和2.2(右EGF)两式。这个时候把A作为根节点存入二叉树中(必须是根节点才能存入)。递归进入下一步,比较1.1和2.1式:此时B为根节点,B左右两边C、D分别就是左右子树了。再比较1.2和2.2式:2.2式中E在最左边,E是根节点但没有左子树(如果2.2式中E在最右边则E没有右子树)。再递归比较"FG"和"GF",同上,二叉树建立完毕。
1 //把先序和中序遍历排好序的数组传入数组,i、j和m、n分别为对应数组的0下标和尾下标 2 BiTree init_BiTree(char preord[],char inord[],int i,int j,int m,int n){ 3 4 BiTree biTree = (BiTreeNode *)malloc(sizeof(BiTreeNode)); 5 if(biTree == NULL) 6 return NULL; 7 8 biTree->date = preord[i]; 9 10 int k = m; 11 12 while(preord[i]!=inord[k]) 13 k++; 14 15 //左子树的建立 16 if(k == m) 17 biTree->lchild = NULL; 18 else 19 biTree->lchild = init_BiTree(preord,inord,i+1,i+k-m,m,k-1); 20 /*特别注意数组下标的范围传入,i,j和m、n与k。必须要有数组原本的开头或者结束的下标值*/ 21 22 //右子树的建立 23 if(k == n) 24 biTree->rchild = NULL; 25 else 26 biTree->rchild = init_BiTree(preord,inord,i+k-m+1,j,k+1,n); 27 /*特别注意数组下标的范围传入,i,j和m、n与k。必须要有数组原本的开头或者结束的下标值*/ 28 29 return biTree; 30 } 31 32 BiTree createBiTree(char preord[],char inord[],int i){ 33 34 BiTree init_BiTree(char preord[],char inord[],int i,int j,int m,int n); 35 36 BiTree biTree; 37 if(i<=0) 38 biTree = NULL; 39 40 biTree = init_BiTree(preord,inord,0,i-1,0,i-1); 41 return biTree; 42 43 }
试运行:
1 void main(){ 2 3 BiTree init_BiTree(char preord[],char inord[],int i,int j,int m,int n); 4 BiTree createBiTree(char preord[],char inord[],int i); 5 void preOrd(BiTree biTree); 6 void inOrd(BiTree biTree); 7 void postOrd(BiTree biTree); 8 9 char preord[7] = {'A','B','C','D','E','F','G'}; 10 char inord[7] = {'C','B','D','A','E','G','F'}; 11 12 BiTree biTree = createBiTree(preord,inord,7); 13 preOrd(biTree); 14 15 }