二叉樹前序中序建立和後序中序建立
阿新 • • 發佈:2019-02-15
<1>已知二叉樹的前序序列和中序序列,求解樹。
1、確定樹的根節點。樹根是當前樹中所有元素在前序遍歷中最先出現的元素。
2、求解樹的子樹。找出根節點在中序遍歷中的位置,根左邊的所有元素就是左子樹,根右邊的所有元素就是右子樹。若根節點左邊或右邊為空,則該方向子樹為空;若根節點
邊和右邊都為空,則根節點已經為葉子節點。
3、遞迴求解樹。將左子樹和右子樹分別看成一棵二叉樹,重複1、2、3步,直到所有的節點完成定位。
<2>、已知二叉樹的後序序列和中序序列,求解樹。
1、確定樹的根。樹根是當前樹中所有元素在後序遍歷中最後出現的元素。
2、求解樹的子樹。找出根節點在中序遍歷中的位置,根左邊的所有元素就是左子樹,根右邊的所有元素就是右子樹。若根節點左邊或右邊為空,則該方向子樹為空;若根節點
邊和右邊都為空,則根節點已經為葉子節點。
3、遞迴求解樹。將左子樹和右子樹分別看成一棵二叉樹,重複1、2、3步,直到所有的節點完成定位。
#include<bits/stdc++.h> using namespace std; typedef struct node { char data; struct node *lchild,*rchild; }BiTNode,*BiTree; void pro_mid_createBiTree(BiTree &T,char *last,char *mid,int len)//後序中序還原建立二叉樹 { if(len==0) { T=NULL; return ; } char ch = last[len-1]; //取得後序遍歷順序中最後一個結點 int index = 0;//在中序序列中進行查詢根結點,並用index記錄其在序列中的索引 while(mid[index]!=ch)//在中序中找到的所有結點的左邊為該結點的左子樹,右邊為右子樹 { index++; } T=(BiTNode *)malloc(sizeof(BiTNode )); T->data = ch; pro_mid_createBiTree(T->lchild,last,mid,index);//建立左子樹 pro_mid_createBiTree(T->rchild,last+index,mid+index+1,len-index-1);//建立右子樹 } void pre_mid_createBiTree(BiTree &T,char *prim,char *mid,int len) //前序中序還原建立二叉樹 { if(len==0) { T=NULL; return ; } char ch = prim[0]; //找到先序中的第一個結點 int index =0; while(mid[index]!=ch)//在中序中找到的所有結點的左邊為該結點的左子樹,右邊為右子樹 { index++; } T=(BiTNode *)malloc(sizeof(BiTNode )); T->data = ch; pre_mid_createBiTree(T->lchild,prim+1,mid,index);//建立左子樹 pre_mid_createBiTree(T->rchild,prim+index+1,mid+index+1,len-index-1);//建立右子樹 } void pre_order(BiTree T)//前序遞迴遍歷二叉樹 { if(T) { cout<<T->data; pre_order(T->lchild); pre_order(T->rchild); } } void pro_order(BiTree T)//後序遞迴遍歷二叉樹 { if(T) { pro_order(T->lchild); pro_order(T->rchild); cout<<T->data; } } int main() { BiTree T; int n; char prim[100],mid[100],last[100]; while(cin>>n) { cout<<"前序中序建立二叉樹後序輸出:"<<endl; for(int i =0 ;i<n;i++) { cin>>prim[i]; } for(int i =0 ;i<n;i++) { cin>>mid[i]; } pre_mid_createBiTree(T,prim,mid,n); pro_order(T); cout<<endl; cout<<"後序中序建立二叉樹前序輸出:"<<endl; for(int i =0 ;i<n;i++) { cin>>last[i]; } for(int i =0 ;i<n;i++) { cin>>mid[i]; } pro_mid_createBiTree(T,last,mid,n); pre_order(T); cout<<endl; } return 0; }