《剑指offer》面试题7:重建二叉树

题目

输入某二叉树的前序遍历和中序遍历的结果,请重新建立该二叉树。假设输入的前序遍历和中序遍历都不含重复的数字。

例子

输入的前序遍历是{1,2,4,7,3,5,6,8},输入的中序遍历是{4,7,2,1,5,3,8,6};输出的树形如下:

求解

#include <iostream>
#include <queue>
using namespace std;

struct Node{
	int data;
	Node *lchild,*rchild;
};
//下面分别是先序遍历和中序遍历
int pre[8] = {1,2,4,7,3,5,6,8};
int  In[8] = {4,7,2,1,5,3,8,6};
//输入的参数是先序遍历和中序遍历的边界,输出的是根节点的指针
Node* create(int preL,int preR,int inL,int inR){
	if(preL > preR) return NULL;
	Node *node = new Node;
	node->data = pre[preL];//先序遍历的第一个元素必定是根

	int k=inL;
	while(In[k]!=pre[preL]) k++;//利用根的值,将中序遍历分割成左右两棵子树
	int numleft =  k - inL;

	node->lchild = create(preL+1,preL+numleft,inL,k-1);//将建立好的左子树赋到左孩子上
	node->rchild = create(preL+numleft+1,preR,k+1,inR);//同上
	return node;
}
//下面的BFS和main函数都是为了检验上面的代码
void BFS(Node *node){
	queue<Node*> q;
	q.push(node);
	int num=0;
	while(!q.empty()){
		Node* temp = q.front();
		q.pop();
		printf("%d",temp->data);
		num++;
		if(num < 8) printf(" ");
		if(temp->lchild != NULL) q.push(temp->lchild);
		if(temp->rchild != NULL) q.push(temp->rchild);
	}
}

int main(){
	Node* ans = create(0,7,0,7);
	BFS(ans);
	return 0;
}

总结

建树的方法,是利用前序和中序的关系,将树的左右子树划分开,再借助递归的思想,把建立一个大树的问题分割成了建立左右两棵子树的问题,这样问题就会被递归地解决,递归的边界就是当树为空时,先序遍历的边界范围会出现错误(preL会大于preR),从而跳出结束向下的递归。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值