根据前序遍历和中序遍历的结果,重建二叉树
#include<iostream>
using namespace std;
#include <vector>
#include <algorithm>
/* 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
*/
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){
if(pre.empty() || vin.empty())
return NULL;
TreeNode *root = new TreeNode(pre[0]);
for(int i = 0; i < vin.size(); ++i)
{
if(vin[i] == pre[0]) //在中序遍历中找到根节点
{
int lnum = i, rnum = vin.size() - i - 1; //左子树有lnum个结点,右子树有rnum个结点
//下面把pre和vin各自分成左子树和右子树,为了递归调用此函数
vector<int> preleft(pre.begin() + 1, pre.begin() + 1 + lnum);
vector<int> preright(pre.begin() + 1 + lnum, pre.end());
vector<int> vinleft(vin.begin(), vin.begin() + i);
vector<int> vinright(vin.begin() + i + 1, vin.end());
root->left = reConstructBinaryTree(preleft, vinleft); //重建左子树
root->right = reConstructBinaryTree(preright, vinright); //重建右子树
break;
}
}
return root;
}
};
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;
s.reConstructBinaryTree(pre, vin);
return 0;
}