首页 > 其他分享 >leetcode106从中序与后序遍历序列构造二叉树

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

时间:2024-03-24 21:32:58浏览次数:28  
标签:遍历 下标 int 中序 leetcode106 二叉树 root ri

目录

本文针对原链接题解的比较晦涩的地方重新进行说明解释
原题解链接: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.变量名缩写与英文单词对应关系

变量名缩写变量名单词
isinorder_start(中序遍历数组-起始下标)
ieinorder_end(中序遍历数组-末尾下标)
psposter_start(后序遍历数组-起始下标)
peposter_end(后序遍历数组-末尾下标)
riroot_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;
    }
};

标签:遍历,下标,int,中序,leetcode106,二叉树,root,ri
From: https://blog.csdn.net/weixin_46028606/article/details/136804694

相关文章

  • [数据结构]二叉树的建立与遍历(递归)
    一、二叉树的遍历与建立首先我们拥有如下二叉树:要了解二叉树遍历,我们得先了解二叉树的三种遍历方式:前序遍历,中序遍历,后序遍历1.前序遍历前序遍历:根,左子树,右子树遍历的结果就是:1248NN9NN510NN11NN36NN7NN2.中序遍历中序遍历:左子树根......
  • 数据结构----认识树和二叉树
    数据结构----认识树和二叉树树和二叉树是计算机科学中重要的数据结构,它们提供了一种分层的组织方式,并被广泛应用于各个领域。本篇博客将介绍树的概念、结构,以及二叉树的特殊形式,以帮助读者对树和二叉树有更深入的理解。1.什么是树?树是一种非线性的数据结构,由节点组成,呈......
  • 树和二叉树知识总结
    文章目录树树的定义树的其他表示方法树的基本术语树结构和线性结构的比较二叉树二叉树的定义二叉树的抽象数据类型定义二叉树的性质满二叉树完全二叉树完全二叉树的性质完满二叉树二叉树的存储结构顺序存储结构链式存储结构二叉树的遍历三种遍历方式递归实现非递归实......
  • 深入了解:二叉树(最详细,约10000字)
    目录1.树概念及结构1.1树概念1.2树的表示2.二叉树概念及结构2.1概念2.2数据结构中的二叉树2.3特殊的二叉树2.4二叉树的存储结构2.4.1顺序存储2.4.2链式存储2.5二叉树的性质3.二叉树顺序结构及概念3.1二叉树的顺序结构3.2堆的概念及结构3.3堆的实现4.二叉树......
  • arguments 这种类数组如何遍历
    类数组对象所谓的类数组对象:拥有一个length属性和若干索引属性的对象举个例子:vararray=['name','age','sex'];vararrayLike={0:'name',1:'age',2:'sex',length:3}即便如此,为什么叫做类数组对象呢?那让我们从读写、获取长度、遍......
  • 数据结构(五)——二叉树的遍历和线索二叉树
    5.3.二叉树的遍历和线索二叉树5.3.1_1二叉树的先中后序遍历遍历:按照某种次序把所有结点都访问一遍二叉树的递归特性:        ①要么是个空二叉树        ②要么就是由“根节点+左子树+右子树”组成的二叉树先序遍历:根左右(NLR)中序遍历:左根右(LNR)后序遍......
  • leedcode-二叉树的所有路径
    迭代法-深度优先搜索classSolution:defbinaryTreePaths(self,root:Optional[TreeNode])->List[str]:ifnotroot:return[]#如果根节点为空,直接返回空列表stack=[(root,str(root.val))]#初始化栈,栈中存储的是节点......
  • 一道平衡二叉树的求解
    最近在看二叉树的算法,我觉得有点迷迷糊糊,就是那种一看就会,一写就费。我有点很奇怪的感觉,就感觉二叉树的很多问题,其实在于一步一步的遍历(或者称为迭代,或者是递归方法),然后在遍历的基础上进行逻辑(业务)操作。首先在这讲一下递归。递归有三部曲:一.确定函数参数,确定函数的返回值......
  • 二维矩阵螺旋遍历
    //3.螺旋矩阵//例如n=4//要求:打印出螺旋矩阵,求i行j列的数字,0<n<10000//算法思想:只要找出每一层的第一个数即可,第一个数值为上一层的第一个数+4*n+4,循//环时n每次减2//+-------------------------->X轴//|1234//1213145//|1116156//|10......
  • 二叉树的创建,遍历与销毁
    二叉树的创建,遍历与销毁#include<iostream>#include<bits/stdc++.h>usingnamespacestd;structTreeNode{ charval;//数据域 TreeNode*lchild;//左子树 TreeNode*rchild;//右子树};classBiTree{ private: TreeNode*root;//根节点 public: BiTree()......