题目
思路
前序遍历第一个数肯定是根节点 root
然后在中序遍历中找到根节点,根节点左侧就是左子树右侧就是右子树,记录下根节点在中序遍历中位置或长度。
这样就能从前序遍历和中序遍历中分离出
- 左子树的前、中序遍历===>
root->left
- 右子树的前、中序遍历===>
root->right
代码
/**
* 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) {
int len = pre.size();
if (len == 0) return NULL;
TreeNode *root = new TreeNode(pre[0]);
int ind = 0;
vector<int> right_pre, right_vin, left_pre, left_vin;
//在中序遍历中找到左右子树分界点
for (int i = 0; i < len; i++) {
if (vin[i] == pre[0]) {
ind = i;
break;
}
}
//下面俩循环取出 左、右子树的前序遍历和中序遍历
for (int i = 0; i < ind; i++) {
left_vin.push_back(vin[i]); //左子树的中序遍历
left_pre.push_back(pre[i + 1]);//左子树的前序遍历,从根节点下一个开始
}
for (int i = ind + 1; i < len; i++) {
right_vin.push_back(vin[i]);//右子树的中序遍历
right_pre.push_back(pre[i]);//右子树的前序遍历
}
root->left = reConstructBinaryTree(left_pre, left_vin);
root->right = reConstructBinaryTree(right_pre, right_vin);
return root;
}
};