当前位置: 首页 > article >正文

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

目录

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);

      }
  };


http://www.kler.cn/a/381759.html

相关文章:

  • 在vscode的ESP-IDF中使用自定义组件
  • Spring-Boot 插件
  • 怎么设置电脑密码?Windows和Mac设置密码的方法
  • Redis+注解实现限流机制(IP、自定义等)
  • 109.【C语言】数据结构之求二叉树的高度
  • 【Mysql】truncate 和 delete的区别
  • 「Mac畅玩鸿蒙与硬件21」鸿蒙UI组件篇11 - Canvas 组件的静态进阶应用
  • go语言中的nil类型
  • debian系统安装qt的时候 显示xcb相关文件缺失
  • 在培训班学网络安全有用吗
  • 【maven】idea执行了maven的install命令给本地安装项目依赖包 安装后删除
  • Python使用爬虫
  • CSS Position 定位如何使用?
  • 5个有效的华为(HUAWEI)手机数据恢复方法
  • java项目之校园周边美食探索及分享平台(springboot)
  • Neo4j入门:详解Cypher查询语言中的MATCH语句
  • [论文阅读]BERT-based Lexical Substitution
  • 写文件回前端进行下载,报错:原因:CORS 头缺少 ‘Access-Control-Allow-Origin‘)
  • 青少年编程与数学 02-003 Go语言网络编程 10课题、HTTP/HTTPS协议
  • PDF全能免费转换 3.18 | 免费PDF工具集,多种转换和美化功能
  • 前后端理解、API接口
  • Caffeine 手动策略缓存 put() 方法源码解析
  • Java基础-组件及事件处理(上)
  • Qt 环境实现视频和音频播放
  • 【C++的vector、list、stack、queue用法简单介绍】
  • Oracle OCP认证考试考点详解082系列09