首页 > 编程语言 >【算法】递归+深搜:106.从中序与后序遍历序列构造二叉树(medium)

【算法】递归+深搜:106.从中序与后序遍历序列构造二叉树(medium)

时间:2024-11-05 22:18:42浏览次数:3  
标签:遍历 106 中序 medium right 二叉树 inorder root 节点

目录

1、题目链接

相似题目:

2、题目

3、解法

函数头-----找出重复子问题

函数体---解决子问题

4、代码


1、题目链接

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

相似题目:

105.从前序与中序遍历序列构造二叉树

889.根据前序和后序遍历构造二叉树(LeetCode)

2、题目

3、解法

整体思路可以借鉴这篇文章:【算法】递归+深搜:105.从前序与中序遍历序列构造二叉树-CSDN博客

首先,我们还是先确定,中序和后序对于我们构建二叉树的作用。


中序遍历性质: 节点按照 [ 左子树 | 根节点 | 右子树 ] 排序。

后序遍历性质: 节点按照 [ 左子树 | 右子树 | 根节点 ] 排序。

后序找出根节点的值,

中序找出左、右子树。

函数头-----找出重复子问题

重复子问题:前序构建二叉树。(根节点、左子树根节点、右子树根节点)

参数: 后序数组、根节点在前序遍历的索引 root 、子树在中序遍历的左边界 left 、子树在中序遍历的右边界 right 

函数体---解决子问题

1、构建根节点、

2、找出根节点在中序遍历中对应的下标 " i "(利用哈希表进行辅助),划分左、右子树

3、构建左子树(更新参数root、left、right)

4、构建右子树(更新参数root、left、right)

4、代码


  class Solution {

      unordered_map<int, int> hash;
  public:
      TreeNode* dfs(const vector<int>& postorder, int root, int left, int right)
      {

          if (left > right)
              return NULL;

          TreeNode* node = new TreeNode(postorder[root]);//构建根节点
          int inorder_root = hash[postorder[root]];     //确定inorder中root的下标

          int right_size = right - inorder_root;
          node->left = dfs(postorder, root - 1 - right_size, left, inorder_root - 1);
          node->right = dfs(postorder, root - 1, inorder_root + 1, right);

          return node;
      }

      TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
          //inorder填充hash
        for (int i = 0; i < inorder.size(); i++)
        {
            hash[inorder[i]] = i;
        }

        return dfs(postorder, inorder.size() - 1, 0, inorder.size() - 1);

      }
  };

标签:遍历,106,中序,medium,right,二叉树,inorder,root,节点
From: https://blog.csdn.net/m0_73726899/article/details/143529353

相关文章

  • 代码随想录算法训练营第十四天|leetcode226. 翻转二叉树、leetcode101.对称二叉树、le
    1leetcode226.翻转二叉树题目链接:226.翻转二叉树-力扣(LeetCode)文章链接:代码随想录视频链接:听说一位巨佬面Google被拒了,因为没写出翻转二叉树|LeetCode:226.翻转二叉树哔哩哔哩bilibili自己的思路:之前想过就是使用层序遍历的方法来做这一道题目,后来感觉有一些行不通,就......
  • 代码随想录算法训练营第十三天|二叉树的理论基础、二叉树的递归遍历、二叉树的层序遍
    1二叉树的理论基础文章链接:代码随想录视频链接:关于二叉树,你该了解这些!|二叉树理论基础一网打尽,二叉树的种类、二叉树的存储方式、二叉树节点定义、二叉树的遍历顺序哔哩哔哩bilibili1.1二叉树的种类满二叉树所有节点处的值都排满了,没有空的完全二叉树只有在最后......
  • 【初阶数据结构篇】链式结构二叉树(续)
    文章目录须知......
  • leetcode107. 二叉树的层序遍历 II
    给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)示例1:输入:root=[3,9,20,null,null,15,7]输出:[[15,7],[9,20],[3]]示例2:输入:root=[1]输出:[[1]]示例3:输入:root=[]输出:[]提示:树......
  • 数据结构 ——— 计算链式二叉树叶子节点的个数以及计算链式二叉树的高度
    目录前言链式二叉树示意图​编辑手搓一个链式二叉树计算链式二叉树的叶子节点个数计算链式二叉树的高度 前言上一章学习了计算链式二叉树的节点个数数据结构———计算链式二叉树节点的个数-CSDN博客接下来学习的是计算链式二叉树叶子节点的个数以及计算链式二叉......
  • 二叉树的一些相关操作
    前言    链式结构二叉树的访问基本使用递归来进行访问,同时也可以体现出递归的暴力美学。因为有涉及到二叉树的相关操作,因此先要手动构造一个二叉树,在对其进行一些操作。        本篇一切对二叉树的操作都基于我创建的二叉树        这个是我构造的......
  • 二叉树的递归遍历(前、中、后序)
    二叉树的递归遍历题目链接:前序遍历:LeetCode144中序遍历:LeetCode94后序遍历:LeetCode145描述给你二叉树的根节点root,返回它节点值的前序、中序、后序遍历。示例1:前序遍历输入:root=[1,null,2,3]输出:[1,2,3]示例2:中序遍历输入:root=[1,null,......
  • 数据结构 ——— 链式二叉树的前中后序遍历递归实现
    目录前言链式二叉树示意图​编辑手搓一个链式二叉树链式二叉树的前序遍历链式二叉树的中序遍历链式二叉树的后序遍历 前言在上一章学习了链式二叉树的前中后序遍历的解析数据结构———链式二叉树的前中后序遍历解析-CSDN博客接下来要学习的是代码实现链式二叉树......
  • 【数据结构】二叉树——堆
    一、二叉树的概念与结构二叉树的概念二叉树是树的一种,二叉树的特殊之处在于,每个根节点都可以有两个子节点,可以两个子节点都为空,或者一个为空,一个不为空,或者两个都有数,在构建二叉树的节点时就可以看出:现实中的二叉树:就像这颗树,每次分叉都分出两个枝条,这就是一个二叉树......
  • 二叉树进阶-二叉搜索树
    目录1.二叉树的概念2.二叉搜索树的操作2.1二叉搜索树的结构2.2实现节点的查找(find)2.3实现增加节点(insert)2.4实现删除节点(erase)2.5析构函数2.6二叉搜索树的完整实现3.二叉搜索树的应用3.1K模型3.2KV模型4.二叉搜索树的性能分析1.二叉树的概念二叉搜索树也叫二......