题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
#include <iostream>
#include <vector>
using namespace std;
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.size()){
return NULL;
}
TreeNode* head = new TreeNode(pre[0]);
//找到根结点在中序遍历中的序号,将树分为左右两部分
int index = 0;
for (int i = 0; i<vin.size(); i++){
if (vin[i] == pre[0]){
index = i;
break;
}
}
vector<int> left_pre, left_vin, right_pre, right_vin;
for (int i = 1; i<pre.size(); i++){
if (i<index + 1)
left_pre.push_back(pre[i]);
else
right_pre.push_back(pre[i]);
}
for (int i = 0; i<vin.size(); i++){
if (i<index)
left_vin.push_back(vin[i]);
if (i>index)
right_vin.push_back(vin[i]);
}
head->left = reConstructBinaryTree(left_pre, left_vin);
head->right = reConstructBinaryTree(right_pre, right_vin);
return head;
}
};
int main(){
int pre[] = { 1, 2, 4, 7, 3, 5, 6, 8 };
int in[] = { 4, 7, 2, 1, 5, 3, 8, 6 };
vector<int> vpre(pre, pre + 8);
vector<int> vin(in, in + 8);
Solution solution;
TreeNode* tree = solution.reConstructBinaryTree(vpre, vin);
return 0;
}