版权声明:如若转载,请联系作者。 https://blog.csdn.net/liu16659/article/details/89715456
由先序和中序序列构建一棵二叉树 C++版
1.题意
由先序和中序序列构建一棵二叉树
2.分析
思路比较,不在啰嗦。但是需要注意如下几点:
- step 1:构建子树时返回的边界条件。如果这个节点已经不存在左右节点了,则应该返回NULL。那在什么条件下,不存在左右节点呢,很明显是在
preL>preR
时。 - step 2:这里没有对numLeft进行大小数目的限制,【理论上,在建树时,是不需要针对此选项进行限制的。因为我们需要返回NULL,就必须要求即使是
numLeft =0
,也应该继续往下执行,然后让程序自己返回NULL。】
3.代码
#include<cstdio>
#include<iostream>
#include<vector>
#define maxn 1005
using namespace std;
int in[maxn];
int pre[maxn];
struct node{
int data;
node* lchild;
node* rchild;
};
int N,M;
node* create(int preL,int preR,int inL,int inR){
if(preL > preR){
return NULL;
}
node* root = new node;
root->data = pre[preL];//将pre的preL值放入到结构体中
int i ;
for(i = inL; i <= inR;i++) {
if(in[i] == pre[preL]) break;
}
int numLeft = i - inL;//看左边是否还有节点
//注意这里没有对numLeft的数目进行判断!!
root->lchild = create(preL+1,preL+numLeft,inL,i-1);
root->rchild = create(preL+numLeft+1,preR,i+1,inR);
return root;
}
//inOrder
void inOrder(node* root){
if(root->lchild != NULL ) inOrder(root->lchild);
cout << root->data << " ";
if(root->rchild != NULL ) inOrder(root->rchild);
}
int main(){
cin >> N;
int i;
for(i = 0;i< N;i++) cin >> in[i];
for(i = 0;i< N;i++) cin >> pre[i];
node* root;
root = create(0,N-1,0,N-1);
inOrder(root);
}
4.测试用例
8
7 2 3 4 6 5 1 8
5 3 7 2 6 4 8 1