首页 > 其他 > 详细

先序+中序/中序+后序/先序+后序 构造二叉树

时间:2021-03-30 20:48:04      阅读:25      评论:0      收藏:0      [点我收藏+]

先序+中序 构造二叉树

 1 #include<iostream>
 2 using namespace std;
 3 
 4 typedef struct BiTNode{
 5     int data;
 6     struct BiTNode *lChild,*rChild;
 7 }BiTNode,*BiTree;
 8 
 9 bool preAndInCreate(BiTree &T,int pre[],int in[],int length){
10     if(length<=0){
11         T=NULL;
12     }else{
13         int i;
14         T=new BiTNode; 
15         T->data=pre[0];
16         for(i=0;i<length&&in[i]!=pre[0];++i);
17         if(i>length) return false;
18         preAndInCreate(T->lChild,pre+1,in,i);
19         preAndInCreate(T->rChild,pre+i+1,in+i+1,length-1-i);
20     }
21     return true;
22 }
23 
24 bool deleteTree(BiTree &T){
25     if(T){
26         BiTree L=T->lChild;
27         BiTree R=T->rChild;
28         delete T;
29         T=NULL;
30         deleteTree(L);
31         deleteTree(R);
32     }
33 }
34 
35 bool postTraverse(const BiTree &T){
36     if(T){
37         if(postTraverse(T->lChild))
38             if(postTraverse(T->rChild)){
39                 cout<<T->data<<" ";
40                 return true;
41             }
42         return false;
43     }
44     return true;
45 }
46 
47 int main(){
48     int n;
49     cout<<"Input the number of nodes : ";
50     cin>>n;
51     cout<<"Input preorder tree : ";
52     int pre[n],in[n];
53     for(int i=0;i<n;++i) cin>>pre[i];
54     cout<<"Input inorder tree : ";
55     for(int i=0;i<n;++i) cin>>in[i];
56     BiTree T=NULL;
57     preAndInCreate(T,pre,in,n);
58     cout<<"\nthe tree in postorder : ";
59     postTraverse(T);
60     deleteTree(T);
61 }

技术分享图片

 

 

中序+后序 构造二叉树

 1 #include<iostream>
 2 using namespace std;
 3 
 4 typedef struct BiTNode{
 5     int data;
 6     struct BiTNode *lChild,*rChild;
 7 }BiTNode,*BiTree;
 8 
 9 bool InAndPostCreate(BiTree &T,int in[],int post[],int length){
10     if(length<=0){
11         T=NULL;
12     }else{
13         int i;
14         T=new BiTNode; 
15         T->data=post[length-1];
16         for(i=0;i<length&&in[i]!=post[length-1];++i);
17         if(i>length) return false;
18         InAndPostCreate(T->lChild,in,post,i);
19         InAndPostCreate(T->rChild,in+i+1,post+i,length-1-i);
20     }
21     return true;
22 }
23 
24 bool deleteTree(BiTree &T){
25     if(T){
26         BiTree L=T->lChild;
27         BiTree R=T->rChild;
28         delete T;
29         T=NULL;
30         deleteTree(L);
31         deleteTree(R);
32     }
33 }
34 
35 bool preTraverse(const BiTree &T){
36     if(T){
37         cout<<T->data<<" ";
38         preTraverse(T->lChild);
39         preTraverse(T->rChild);
40     }
41     return true;
42 }
43 
44 int main(){
45     int n;
46     cout<<"Input the number of nodes : ";
47     cin>>n;
48     int post[n],in[n];
49     cout<<"Input inorder tree : ";
50     for(int i=0;i<n;++i) cin>>in[i];
51     cout<<"Input postorder tree : ";
52     for(int i=0;i<n;++i) cin>>post[i];
53     BiTree T=NULL;
54     InAndPostCreate(T,in,post,n);
55     cout<<"\nthe tree in preorder : ";
56     preTraverse(T);
57     deleteTree(T);
58 }

技术分享图片

 

 

先序+后序 可以构造二叉树,但是无法唯一确定一棵二叉树

比如 pre:123 , post:321 , 则中序可以为231,321

试返回由先序和后序序列构造的一棵二叉树

 1 #include<iostream>
 2 using namespace std;
 3 
 4 typedef struct BiTNode{
 5     int data;
 6     struct BiTNode *lChild,*rChild;
 7 }BiTNode,*BiTree;
 8 
 9 bool preAndPostCreate(BiTree &T,int pre[],int post[],int length){//用 传指针或者传新数组(其实传指针相当于传新数组) 而不用 传下标数字以及原数组 真的简化了很多,省了很多关于下标的麻烦。
10     if(length<=0){
11         T=NULL;
12     }else if(length==1){
13         T=new BiTNode;
14         T->data=pre[0];
15         preAndPostCreate(T->lChild,NULL,NULL,0);
16         preAndPostCreate(T->rChild,NULL,NULL,0);
17     }else{ 
18         int i;
19         T=new BiTNode;
20         T->data=pre[0];
21         for(i=0;i<length&&post[i]!=pre[1];++i);
22         preAndPostCreate(T->lChild,pre+1,post,i+1);
23         preAndPostCreate(T->rChild,pre+2+i,post+i+1,length-2-i);
24     }
25     return true;
26 }
27 
28 bool deleteTree(BiTree &T){
29     if(T){
30         BiTree L=T->lChild;
31         BiTree R=T->rChild;
32         delete T;
33         T=NULL;
34         deleteTree(L);
35         deleteTree(R);
36     }
37 }
38 
39 bool inTraverse(const BiTree &T){
40     if(T){
41         inTraverse(T->lChild);
42         cout<<T->data<<" ";
43         inTraverse(T->rChild);
44     }
45     return true;
46 }
47 
48 int main(){
49     int n;
50     cout<<"Input the number of nodes : ";
51     cin>>n;
52     cout<<"Input preorder tree : ";
53     int pre[n],post[n];
54     for(int i=0;i<n;++i) cin>>pre[i];
55     cout<<"Input postorder tree : ";
56     for(int i=0;i<n;++i) cin>>post[i];
57     BiTree T=NULL;
58     if(!preAndPostCreate(T,pre,post,n)){
59         cout<<"fail"<<endl;
60     }else{
61         cout<<"\nthe tree in inorder : ";
62         inTraverse(T);    
63     }
64     deleteTree(T);
65 }

技术分享图片

 

先序+中序/中序+后序/先序+后序 构造二叉树

原文:https://www.cnblogs.com/NoerForest/p/14595779.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!