题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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)); //后加中
}