美文网首页
Leetcode 106. 从中序与后序遍历序列构造二叉树(分治

Leetcode 106. 从中序与后序遍历序列构造二叉树(分治

作者: 进击的Lancelot | 来源:发表于2020-06-15 12:35 被阅读0次

    问题描述

    根据一棵树的中序遍历与后序遍历构造二叉树。
    注意:你可以假设树中没有重复的元素。

    Example

    中序遍历 inorder = [9,3,15,20,7]
    后序遍历 postorder = [9,15,7,20,3]


    题目链接:106. 从中序与后序遍历序列构造二叉树 (难度:中等)

    思路

    树的后序遍历顺序为 LRN,中序遍历顺序为 LNR。因此,我们可以采用分治的思想,以后序序列 postorder 中的 postorder[r_post] 为树的根节点 root,然后通过 root 我们可以中序序列划分为左右两棵子树,分别对左右两棵子树递归处理,即可完成建树,如下图所示


    选择根节点,划分左右子树
    递归处理右子树

    代码

    class Solution {
    public:
        TreeNode* buildTree(vector<int>& inorder, int l_in, int r_in, vector<int>& postorder, int l_post, int r_post){
            if(l_in > r_in)
                return NULL;
            TreeNode* root = new TreeNode(postorder[r_post]);
            int pos = l_in;
            while(inorder[pos] != postorder[r_post]){
                ++pos;
            }
            root->left = buildTree(inorder, l_in, pos - 1, postorder, l_post, r_post - r_in + pos - 1);
            root->right = buildTree(inorder, pos + 1, r_in, postorder, r_post - r_in + pos, r_post - 1);
            return root;
        }
        TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
            if(inorder.empty()) return NULL;
            int len = inorder.size() - 1;
            return buildTree(inorder, 0, len, postorder, 0, len);
        }
    };
    

    执行结果:40 ms, 17.6 MB

    相关文章:

    相关文章

      网友评论

          本文标题:Leetcode 106. 从中序与后序遍历序列构造二叉树(分治

          本文链接:https://www.haomeiwen.com/subject/unecxktx.html