题解 | #重建二叉树#

重建二叉树

https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6

  1. 与树有关的问题第一时间尝试递归,分解子问题。
  2. 前序遍历的顺序是中左右,所以如果利用遍历结果建树,那么前序遍历数组的第一个数一定是根节点存储的树。
  3. 在中序遍历数组中找到这个根节点存储的数,因为中序遍历的顺序是左中右,所以中序遍历数组中该数左边的部分一定是根节点左子树存储的数,该数右边的部分一定是根节点右子树存储的数。
  4. 因为知道了中序遍历数组的左边界、右边界和根节点所在的下标,所以可以求出左子树、右子树的中序遍历数组长度,根据这些长度可以同样划分前序遍历数组。
  5. 利用划分出来的左右子树的前序遍历、中序遍历数组,对左子树和右子树递归建树,最后将指针赋值给根节点的左右子树指针,返回根节点即可。
class Solution {
public:
    TreeNode* reConstructBinaryTree2(vector<int>& pre,vector<int>& vin, int pl, int pr, int vl, int vr) {
        if (pl > pr) return nullptr;
        if (pl == pr) return new TreeNode(pre[pl]);
        TreeNode* res = new TreeNode(pre[pl]);
        int vm = vl;
        for (; vm <= vr; vm++) {
            if (vin[vm] == pre[pl]) break;
        }
        res->left = reConstructBinaryTree2(pre, vin, pl + 1, pl + vm - vl, vl, vm - 1);
        res->right = reConstructBinaryTree2(pre, vin, pl + vm - vl + 1, pr, vm + 1, vr);
        return res;
    }

    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        return reConstructBinaryTree2(pre, vin, 0, pre.size() - 1, 0, vin.size() - 1);
    }
};

全部评论

相关推荐

10-24 00:54
已编辑
门头沟学院 Java
牛客20646354...:这连小厂都找不到就离谱,只能说可能你根本没投什么小厂。说实话现在都要11月了,没什么岗位了。其实最好是在9月找,那时候暑假工刚走,岗位多的是,现在都占满了岗位了,秋招的秋招,顶替暑假工的也基本上都顶替了。 只能多投了,简历其实都差不多,你这都不是外卖+点评去找实习了,已经比好多人优秀了。实在找不到,可以降低一些标准的,能投到自研项目的小厂说实话可能比你去中大厂能学到更多东西。因为中大厂最多给你看一点点模块功能,小厂基本上全部代码甚至几个项目的代码都能拿到。
点赞 评论 收藏
分享
轻絵梨花泪沾衣:南泵,大少爷驾到通通闪开
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务