问题:给一棵二叉树的层序遍历序列和中序遍历序列,求这棵二叉树的先序遍历序列和后序遍历序列。
分析:层次序列第一个元素肯定是根结点了,那么在读入后序元素过程中只需要确定它是根节点的左子树还是右子树问题了就可以解决问题了。因此核心点是:
1)找根节点在中序遍历的下标 u 和 待插入结点val在中序遍历序列的下标k。
2)判断u和v关系:u<k,则插入右子树;否则,插入左子树。
核心代码:
void creat(Node *&root,int val){
if(!root){
root=new Node;
root->data=val;
root->l=root->r=NULL;
return;
}
int k;
for(k=0;k<n;k++){
if(in[k]==val) break;
}
int u;
for(u=0;u<n;u++){
if(in[u]==root->data) break;
}
if(u<k) creat(root->r,val);
else creat(root->l,val);
}
完整代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000000;
struct Node{
int data;
Node *l,*r;
};
int layer[maxn],in[maxn],n;
void creat(Node *&root,int val){
if(!root){
root=new Node;
root->data=val;
root->l=root->r=NULL;
return;
}
int k;
for(k=0;k<n;k++){
if(in[k]==val) break;
}
int u;
for(u=0;u<n;u++){
if(in[u]==root->data) break;
}
if(u<k) creat(root->r,val);
else creat(root->l,val);
}
void pre(Node * root){
if(root){
cout<<root->data<<" ";
pre(root->l);
pre(root->r);
}
}
void post(Node * root){
if(root){
post(root->l);
post(root->r);
cout<<root->data<<" ";
}
}
int main(){
cout<<"Please enter the number of nodes:\n";
cin>>n;
cout<<"Please enter thr layer traversal sequence:\n";
for(int i=0;i<n;i++) cin>>layer[i];
cout<<"Please enter the Inorder traversal sequence:\n";
for(int i=0;i<n;i++) cin>>in[i];
Node * root=NULL;
for(int i=0;i<n;i++){
creat(root,layer[i]);
}
cout<<"Preorder Traversal results: ";
pre(root);
cout<<endl;
cout<<"Postorder traversal result: ";
post(root);
return 0;
}
测试截图:
上一篇:先序,中序,后序建树与最近祖先结点LCA
https://blog.youkuaiyun.com/qq_41317652/article/details/84112201