1. 程式人生 > >二叉樹的建立♪♬♫(先序,前中,中後)

二叉樹的建立♪♬♫(先序,前中,中後)

1.先序遞迴建立二叉樹

首先要判斷當前節點是否為空節點,不是空節點才可以往下進行;
判斷好了節點不為空,就可以為根節點申請記憶體空間了,併為根節點的資料域賦值;
因為這是先根建立二叉樹,<span style="background-color: rgb(51, 255, 51);">先根的順序就是根,左,右</span>,根的問題解決完了,就要解決左子樹的建立問題了;
T->lchild=CBT();讓它進行遞迴,回到第一步,判斷當前節點是否為空節點......吧啦吧啦......
大概就是介個樣子,右子樹也是介個樣子;
最後,再返回根節點,這可二叉樹就建立完成了,是不是很簡單?如果還是不理解,畫一畫圖,就好啦,實踐出真知<img alt="微笑" 

typedef char ElemType;
 typedef struct BiTNode
 {
     char data;
     struct BiTNode *lchild,*rchild;<span style="background-color: rgb(255, 255, 255);">//左右孩子指標;</span>
 }BiTNode,*BiTree;
 BiTree CBT()
 {//先序遞迴建立二叉樹;
     char ch;
     BiTree T;//根節點
     scanf("%c",&ch);
     <span style="background-color: rgb(255, 204, 0);">if(ch=='#') return NULL;</span>

     T=(BiTree)malloc(sizeof(BiTNode));//為根節點申請空間;
     T->data=ch;//為根節點的資料域賦值;
     T->lchild=CBT();//建立左子樹
     T->rchild=CBT();//建立右子樹;

     <span style="background-color: rgb(255, 204, 0);">return T;</span>//返回根節點;
 }

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;
 }