重建二叉树

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

前序+中序得到二叉树

递归实现:前序第一个数root为根节点,在中序找到root,中序中root左边的为根节点的左子树,右边的为根节点的右子树。递归。

#include <iostream>
#include <vector>
using namespace std;
struct TreeNode {
	int val;
	TreeNode *left;
	TreeNode *right;
	TreeNode(int x) : val(x), left(NULL), right(NULL) {}
	
};

TreeNode* recoprevin(vector<int> pre, vector<int> vin, int prefirst, int prelast,
	int vinfirst, int vinlast)
{
	TreeNode* newnode = new TreeNode(pre[prefirst]);
	int length = 0;
	while (vinfirst + length <= vinlast&&pre[prefirst] != vin[vinfirst + length])
		length++;
	int pre1first = prefirst + 1;
	int pre1last = prefirst + length;
	int pre2first = pre1last + 1;
	int pre2last = prelast;
	int vin1first = vinfirst;
	int vin1last = vinfirst + length - 1;
	int vin2first = vinfirst + length + 1;
	int vin2last = vinlast;
	if (pre1first <= pre1last)
	{
		newnode->left = recoprevin(pre, vin, pre1first, pre1last, vin1first, vin1last);
	}
	if (pre2first <= prelast)
	{
		newnode->right = recoprevin(pre, vin, pre2first, pre2last, vin2first, vin2last);
	}
	return newnode;
}

TreeNode* reConstructBinaryTreeprevin(vector<int> pre, vector<int> vin) {
	int prefirst = 0, prelast = pre.size() - 1, vinfirst = 0, vinlast = vin.size() - 1;
	return recoprevin(pre, vin, prefirst, prelast, vinfirst, vinlast);
}

TreeNode* recoposvin(vector<int> pos, vector<int> vin, int posfirst, int poslast, int vinfirst, int vinlast)
{
	TreeNode* newnode = new TreeNode(pos[poslast]);
	int length = 0;
	while (vin[vinfirst + length] != pos[poslast])
		length++;
	int pos1first = posfirst;
	int pos1last = posfirst + length - 1;
	int pos2first = posfirst + length;
	int pos2last = poslast - 1;
	int vin1first = vinfirst;
	int vin1last = vinfirst + length - 1;
	int vin2first = vinfirst + length + 1;
	int vin2last = vinlast;
	if (pos1first <= pos1last)
		newnode->left = recoposvin(pos, vin, pos1first, pos1last, vin1first, vin1last);
	if (pos2first <= pos2last)
		newnode->right = recoposvin(pos, vin, pos2first, pos2last, vin2first, vin2last);
	return newnode;
}

TreeNode* reConstructBinaryTreeposvin(vector<int> pos, vector<int> vin)
{
	int posfirst = 0, poslast = pos.size() - 1, vinfirst = 0, vinlast = vin.size() - 1;
	return recoposvin(pos, vin, posfirst, poslast, vinfirst, vinlast);
}

void preprint(TreeNode* T)
{
	if (T)
	{
		cout << T->val << " ";
		preprint(T->left);
		preprint(T->right);	
	}
}

int main()
{
	vector<int> pre = { 1,2,4,7,3,5,6,8 };  //前序
	vector<int> vin = { 4,7,2,1,5,3,8,6 };  //中序
	vector<int> pos = { 7,4,2,5,8,6,3,1 };  //后序
	preprint(reConstructBinaryTreeprevin(pre, vin)); //前加中
	preprint(reConstructBinaryTreeposvin(pos, vin)); //后加中
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值