C语言二叉树

二叉树使用链做结构,其结构体有存储数据的变量和指向左右孩子的指针

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 }

posted @ 2018-11-28 18:41  捞的不谈  阅读(318)  评论(0编辑  收藏  举报