ICode9

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

LeetCode 106 从中序与后序遍历序列构造二叉树

2022-02-07 14:02:07  阅读:206  来源: 互联网

标签:index 遍历 int 106 二叉树 inorder LeetCode postorder


题目链接:LeetCode 106 从中序与后序遍历序列构造二叉树

题目大意:
给定两个整数数组\(inorder\)和\(postorder\),其中\(inorder\)是二叉树的中序遍历,\(postorder\)是同一棵树的后序遍历,请你构造并返回这颗二叉树。

题解:
首先要知道,后序遍历的数组最后一个元素代表的即为根节点。知道这个性质后,我们可以利用已知的根节点信息在中序遍历的数组中找到根节点所在的下标,然后根据其将中序遍历的数组分成左右两部分,左边部分即左子树,右边部分为右子树,针对每个部分可以用同样的方法继续递归下去构造。

class Solution {
private:
    int index;
    unordered_map<int, int> indexMap;

public:
    TreeNode* helper(int left, int right, vector<int>& inorder, vector<int>& postorder) {
        // 如果这里没有节点构造二叉树了,就结束
        if (left > right) {
            return nullptr;
        }
        // 选择 index 位置的元素作为当前子树根节点
        int rootVal = postorder[index];
        TreeNode* root = new TreeNode(rootVal);
        // 根据 root 所在位置分成左右两棵子树
        int idx = indexMap[rootVal];
        // 下标减一
        index--;
        // 构造右子树
        root->right = helper(idx + 1, right, inorder, postorder);
        // 构造左子树
        root->left = helper(left, idx - 1, inorder, postorder);
        return root;
    }

    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        // 从后序遍历的最后一个元素开始
        index = (int)postorder.size() - 1;
        // 建立(元素,下标)键值对的哈希表
        int idx = 0;
        for (auto& val : inorder) {
            indexMap[val] = idx++;
        }
        return helper(0, (int)inorder.size() - 1, inorder, postorder);
    }
};

标签:index,遍历,int,106,二叉树,inorder,LeetCode,postorder
来源: https://www.cnblogs.com/IzumiSagiri/p/15867631.html

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

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

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

ICode9版权所有