二叉树的建立♪♬♫先序,前中,中后(C++)

1.先序递归建立二叉树

首先要判断当前节点是否为空节点,不是空节点才可以往下进行;
判断好了节点不为空,就可以为根节点申请内存空间了,并为根节点的数据域赋值;
因为这是先根建立二叉树,先根的顺序就是根,左,右,根的问题解决完了,就要解决左子树的建立问题了;
T->lchild=CBT();让它进行递归,回到第一步,判断当前节点是否为空节点......吧啦吧啦......
大概就是介个样子,右子树也是介个样子;
最后,再返回根节点,这可二叉树就建立完成了,是不是很简单?如果还是不理解,画一画图,就好啦,实践出真知 

 

typedef char ElemType;
 typedef struct BiTNode
 {
     char data;
     struct BiTNode *lchild,*rchild;//左右孩子指针;
 }BiTNode,*BiTree;
 BiTree CBT()
 {//先序递归建立二叉树;
     char ch;
     BiTree T;//根节点
     scanf("%c",&ch);
     if(ch=='#') return NULL;

     T=(BiTree)malloc(sizeof(BiTNode));//为根节点申请空间;
     T->data=ch;//为根节点的数据域赋值;
     T->lchild=CBT();//建立左子树
     T->rchild=CBT();//建立右子树;

     return T;//返回根节点;
 }

 

2.前序中序递归建立二叉树

 

啰嗦一下,前序就是遍历二叉树时先遍历根,再左子树,再右子树,即先遍历根;而中序就是左子树,根,右子树,中间遍历根节点;

拿个例子来说一下:

先序序列:abdegcf

中序序列:dbgeafc

我们可以根据先序序列来确定这棵二叉树的根,即a,

abdegcf

然后在中序序列中根左边的序列即为左子树的元素,根右边的序列即为右子树的元素

dbgeafc

 

根据bdeg(先序)和dbge(中序)确定左子树

 

根据eg(先序)和ge(中序)确定左子树的右子树

 

根据cf(前序)和fc(中序)确定右子树

 

所以最后就是酱紫的啦,看下面

 

 

 

BiTree CBT(char *s1,char *s2,int len)
{//前序中序递归建立二叉树
    if(len<=0) return NULL;

    BiTree T;
    T=(BiTree)malloc(sizeof(BiTNode));
    T->data=*s1;//先根序列的第一个节点即为根节点;

    char *x;              
                         //int l=strchr(s2,s1[0])-s2;
    for(x=s2;x!=NULL;x++)//查找中根序列中根的位置;
        if(*x==*s1)
            break;

    int l=x-s2;//求左子树长度;

    T->lchild=CBT(s1+1,s2,l);//建立左子树;
    T->rchild=CBT(s1+l+1,x+1,len-l-1);//建立右子树;

    return T;
}

 

3.中序后序递归建立二叉树

 

中后跟前中的道理是一样的唯一的改变就是前序在第一个是根,后序在最后一个位置是根;

中序序列:bdgeafc

后序序列:dgebfca

bdgeafc(中) dgebfca(后)

此处不作一一赘述,参考前序中序建树;

 

BiTree CBT(char *s1,char *s2,int len)
{//中序后序递归建立二叉树
     if(len<=0) return NULL;

     BiTree T;
     T=(BiTree)malloc(sizeof(BiTNode));
     T->data=*(s2+len-1);//后根序列的最后一个节点即为根节点;

     int l=strchr(s1,s2[len-1])-s1;//包含在string.h下;
                                   //返回字符在字符串中出现的首地址;
     
     T->lchild=CBT(s1,s2,l);
     T->rchild=CBT(s1+l+1,s2+l,len-l-1);

     return T;
 }

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值