重建二叉树
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
#include "stdafx.h"
#include<iostream>
using namespace std;
#include<vector>
/*
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
*/
//Definition for binary tree
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
TreeNode * reConstructBinaryTree(vector<int> pre, vector<int> vin) {
vector<int>::iterator itpre = pre.begin();
vector<int>::iterator itvin = vin.begin();
vector<int> lpre;
vector<int> rpre;
vector<int> lvin;
vector<int> rvin;
TreeNode *tn;
tn = new TreeNode(pre[0]); //初始化根节点
while (*itvin != *itpre) //找到中序遍历列表中的根节点
{
lvin.push_back(*itvin); //左子树中序遍历列表
itvin++;
}
if (*itvin == *itpre) //找到中序遍历中的根节点
{
while (++itvin!=vin.end())
{
rvin.push_back(*itvin); //右子树中序遍历列表
}
pre.erase(pre.begin());
itvin = lvin.begin();
int lvincount = lvin.size();
int rvincount = rvin.size();
itpre = pre.begin();
while (lvincount--)
{
lpre.push_back(*itpre++); //获取左子树前序遍历列表
}
while (rvincount--)
{
rpre.push_back(*itpre++); //获取右子树前序遍历列表
}
if (!lpre.empty() && !lvin.empty())
{
tn->left = reConstructBinaryTree(lpre, lvin); //构建左子树
}
if (!rpre.empty() && !rvin.empty())
{
tn->right = reConstructBinaryTree(rpre, rvin); //构建右子树
}
}
return tn;
}
};
int main()
{
vector<int> pre = { 1,2,4,7,3,5,6,8 };
vector<int> vin = { 4,7,2,1,5,3,8,6 };
Solution s;
TreeNode *tn;
tn = s.reConstructBinaryTree(pre, vin);
return 0;
}