ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

106.construct-binary-tree-inorder-and-postorder-traversal 从中序与后序遍历序列构造二叉树

2022-09-03 16:00:30  阅读:189  来源: 互联网

标签:binary TreeNode get 106 vector 二叉树 root inorder postorder


大致思路,首先找到后序遍历序列的最后一个数,二叉树的根节点(root)就是这个值,然后在中序遍历序列里找到这个数所在的位置(假设索引为i),i左边的数,是根节点左子树的数值,i右边的数,是根节点的右子树,然后根据左子树和右子树的数量,划分后序遍历的序列,分别找出划分后的两个序列的根节点,然后再找出两个根节点再中序遍历的序列中的位置,再划分后序遍历序列,依次迭代。

最直接的版本

class Solution {
  public:
    TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
        // TreeNode *node = new TreeNode;
        return get_root(inorder, postorder);
    }
    TreeNode *get_root(vector<int> &inorder, vector<int> &postorder) {
        if (postorder.size() == 0)
            return nullptr;
        TreeNode *root = new TreeNode(postorder[postorder.size() - 1]);
        // root->val = postorder[postorder.size() - 1];
        int i = 0;
        while (i < inorder.size()) {
            if (root->val == inorder[i])
                break;
            i++;
        }
        //中序遍历的左半部分
        vector<int> l_inorder(inorder.begin(), inorder.begin() + i);
        vector<int> r_inorder(inorder.begin() + i + 1, inorder.end());
        vector<int> l_postorder(postorder.begin(), postorder.begin() + i);
        vector<int> r_postorder(postorder.begin() + i, postorder.end() - 1);
        root->left = get_root(l_inorder, l_postorder);
        //中序遍历切出来的右半部分
        root->right = get_root(r_inorder, r_postorder);
        return root;
    }
};

利用vector索引来划分vector,避免递归中创建vector的优化后的版本,要注意postorder的索引是根据长度来确定的。

class Solution {
  private:
    TreeNode *get_root(vector<int> &inorder, vector<int> &postorder, int in_l, int in_r, int p_l, int p_r) {
        if (p_l >= p_r)
            return nullptr;
        TreeNode *root = new TreeNode(postorder[p_r - 1]);
        int i = 0;
        while (i < in_r) {
            if (root->val == inorder[i])
                break;
            i++;
        }
        //注意这里p_r应该赋什么值,应该根据inorder与postorder长度相等而得出
        root->left = get_root(inorder, postorder, in_l, i, p_l, p_l + i - in_l);
        // 注意这里p_l的值根据长度确定,由p_r - 1减去长度得到
        root->right = get_root(inorder, postorder, i + 1, in_r, p_r + i - in_r, p_r - 1);
        return root;
    }

  public:
    TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
        return get_root(inorder, postorder, 0, inorder.size(), 0, postorder.size());
    }
};

标签:binary,TreeNode,get,106,vector,二叉树,root,inorder,postorder
来源: https://www.cnblogs.com/zwyyy456/p/16652826.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有