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

本文针对原链接题解的比较晦涩的地方重新进行说明解释
原题解链接:https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/solutions/50561/tu-jie-gou-zao-er-cha-shu-wei-wan-dai-xu-by-user72

1.解题关键

后序遍历序列的最后一个元素一定是root节点,中序遍历序列里面,root左边的是左子树,root节点右边的是右子树,接着可以递归处理。
依次把数组分为

2.思路

先使用哈希表记录整个中序序列的数组元素与下标的关系,目的是为了后续直接获取后序遍历序列vector最后一个元素之后直接得到中序里面的root节点的下标,加快算法速度!

3.变量名缩写与英文单词对应关系

变量名缩写 变量名单词
is inorder_start(中序遍历数组-起始下标)
ie inorder_end(中序遍历数组-末尾下标)
ps poster_start(后序遍历数组-起始下标)
pe poster_end(后序遍历数组-末尾下标)
ri root_index(根节点的下标)

4.算法思路图解

在这里插入图片描述

在这里插入图片描述

5.代码

class Solution {
public:
    unordered_map<int,int> map;
    vector<int>* post;
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {        
        for(int i=0;i<inorder.size();++i){
            map[inorder[i]]=i;
        }
        post=&postorder;
        TreeNode* root=dfs(0,inorder.size()-1,0,post->size()-1);
        return root;
    }
    TreeNode* dfs(int is,int ie,int ps,int pe){
        if(ie<is||pe<ps){
            return nullptr;
        }
        int root = (*post)[pe];
        int ri=map[root];
        TreeNode* node=new TreeNode(root);
        node->left=dfs(is,ri-1,ps,ri-is-1+ps);
        node->right=dfs(ri+1,ie,ri-is+ps,pe-1);
        return node;
    }
};

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-23 00:16:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-23 00:16:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-23 00:16:03       87 阅读
  4. Python语言-面向对象

    2024-03-23 00:16:03       96 阅读

热门阅读

  1. LeetCode-热题100:283.移动零

    2024-03-23 00:16:03       40 阅读
  2. Docker compose()

    2024-03-23 00:16:03       44 阅读
  3. Kubernetes集群部署

    2024-03-23 00:16:03       34 阅读
  4. 网络安全——笔记

    2024-03-23 00:16:03       45 阅读
  5. 随机选择游戏角色的代码

    2024-03-23 00:16:03       41 阅读
  6. Nginx编译后平滑升级

    2024-03-23 00:16:03       44 阅读
  7. c语言常见错误

    2024-03-23 00:16:03       47 阅读