由先序和中序序列构建一棵二叉树【C++版】

版权声明:如若转载,请联系作者。 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

猜你喜欢

转载自blog.csdn.net/liu16659/article/details/89715456