题解 | #重建二叉树#

重建二叉树

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

方法:递归

对于二叉树的前序遍历,我们知道序列的第一个元素必定是根节点的值,因为序列没有重复的元素,因此中序遍历中可以找到相同的这个元素,而我们又知道中序遍历中根节点将二叉树分成了左右子树两个部分。

具体做法:

step 1:先根据前序遍历第一个点建立根节点。

step 2:然后遍历中序遍历找到根节点在数组中的位置。

step 3:再按照子树的节点数将两个遍历的序列分割成子数组,将子数组送入函数建立子树。

step 4:直到子树的序列长度为0,结束递归。

时间复杂度:o(n)。

空间复杂度:o(n)。

class Solution {
  public:
    TreeNode* reConstructBinaryTree(vector<int>& preOrder, vector<int>& vinOrder) {
        if (preOrder.size() == 0 || vinOrder.size() == 0)
            return nullptr;
        TreeNode* head = new TreeNode(preOrder[0]);

        for (int i = 0; i < vinOrder.size(); i++) {
		  	//获取前序遍历第一个结点在中序遍历中的位置
            if (vinOrder[i] == preOrder[0]) {
                //左子树
                vector<int> leftvin(vinOrder.begin(), vinOrder.begin() + i);
                vector<int> leftpre(preOrder.begin() + 1, preOrder.begin() + i + 1);
                head->left = reConstructBinaryTree(leftpre, leftvin);
                //右子树
                vector<int> rightvin(vinOrder.begin() + i + 1, vinOrder.end());
                vector<int> rightpre(preOrder.begin() + i + 1, preOrder.end());
                head->right = reConstructBinaryTree(rightpre, rightvin);
            }
        }

        return head;
    }
};

刷题题解(c++) 文章被收录于专栏

算法题题解(c++)

全部评论
很棒呀!
点赞 回复 分享
发布于 2023-07-23 00:43 浙江

相关推荐

11-08 13:58
门头沟学院 Java
程序员小白条:竟然是蓝桥杯人才doge,还要花钱申领的offer,这么好的公司哪里去找
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务