二叉樹的建立♪♬♫(先序,前中,中後)
阿新 • • 發佈:2019-01-07
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;
}