题解 | #重建二叉树#
此处只有代码,基本思想是递归,唯一需要注意的是递归的出口,以避免数组越界:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
//使用 pre[pl,pr] 和 vin[vl,vr] 重构一个二叉树并返回其根节点值
TreeNode* recurionConstructBT(vector<int>& pre,vector<int>& vin,int pl,int pr,int vl,int vr){
//递归出口
//如果左下标大于右下标代表此树已无结点
//同时,也需要注意数组下标越界
//此时,只需要返回空指针即可
if(pl > pr || vl < 0 || vr >= vin.size())
return nullptr;
//使用先序遍历的第一个元素构建该二叉树的根节点
TreeNode* root = new TreeNode(pre[pl]);
//在中序遍历中找到左右子树的分隔点
int i = vl;
for(; i <= vr && vin[i] != pre[pl]; ++i)
;
//递归返回该根节点的左子树
root->left = recurionConstructBT(pre, vin, pl + 1, i + pl - vl, vl, i - 1);
//递归返回该根节点的左子树
root->right = recurionConstructBT(pre, vin, i + pl - vl + 1, pr, i + 1, vr);
//返回该二叉树的根节点
return root;
}
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
return recurionConstructBT(pre, vin, 0, pre.size() - 1,0,vin.size() - 1);
}
};