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

力扣106:从中序与后序遍历序列构造二叉树

力扣106:从中序与后序遍历序列构造二叉树

  • 题目
  • 思路
  • 代码

题目

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
在这里插入图片描述

思路

我们首先要知道中序遍历和后序遍历分别都是什么。
中序遍历是依照左子树,根节点,右子树的顺序来进行遍历。
后序遍历是依照左子树,右子树,根节点的顺序来进行遍历。
我们观察这两个遍历得到的数组看能得到什么信息,首先最明显的是我们通过后序遍历可以确定整个二叉树的根节点也就是后序数组的最后一个位置除此之外也没啥了,接下来是中序数组,中序数组乍一看没啥信息可言但是我们来看其中根节点的位置,再看它的左边和右边我们可以发现整个数组我们只要确定了根节点的位置就可以划分成三部分:左子树,根节点和右子树。那么再找到左子树和右子树的根节点不就可以继续划分下去了吗直到根节点是一个叶子节点没有左子树和右子树。这不就是分治的思想吗,先进行拆分再进行组合。所以这道题我们可以使用分治来做,从根节点开始构建节点然后再构建左子树再构建右子树,同样左子树的根节点继续构建它的两个子树。
在这个过程中我们必须要有两个信息:每次构建时根节点的值以及左右子树在中序数组的范围。
首先是根节点的值,这个我们可以通过后序数组来得到,右子树的根节点下标我们只需要在当前的下标进行–就可以得到了,重点是左子树的根节点的下标。

代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:unordered_map<int,int> um;TreeNode* merge(int root,int left,int right,vector<int>& postorder){//结束的条件是左子树的下标不小于右子树if(left > right){return nullptr;}//构建节点TreeNode* node = new TreeNode(postorder[root]);//得到root位置在中序遍历的下标int i = um[postorder[root]];//构建左子树和右子树//重点解释一下左子树的根节点怎么找//我们肯定也是在后序数组中找其次后序是左,右,根的顺序//左子树的根节点和当前树的根节点只差了一个右子树的长度//所以我们通过中序数组来找到右子树的长度也就是right-i//因为right是有边界,i是根节点在中序数组的下标所以right-i就是右子树的长度//在减去右子树的数量后我们还需要减1node->left = merge(root-(right-i)-1,left,i-1,postorder);node->right = merge(root-1,i+1,right,postorder);return node;}TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {//通过后序遍历我们可以确定根节点的位置//通过中序遍历我们可以得到该节点的左子树和右子树//所以我们可以使用分治的办法将一棵树从根节点开始向下构建for(int i = 0;i < inorder.size();i++){//记录在中序遍历中节点的值所对应的下标um[inorder[i]] = i;}return merge(postorder.size()-1,0,inorder.size()-1,postorder);}
};
http://www.xdnf.cn/news/1248679.html

相关文章:

  • VUE+SPRINGBOOT从0-1打造前后端-前后台系统-登录实现
  • Redis里面什么是sdshdr,可以详细介绍一下吗?
  • Linux lvm逻辑卷管理
  • 跑yolov5的train.py时,ImportError: Failed to initialize: Bad git executable.
  • 【Linux】特效爆满的Vim的配置方法 and make/Makefile原理
  • 一种红外遥控RGB灯带控制器-最低价MCU
  • MySQL间隙锁在查询时锁定的范围
  • 前端遇到页面卡顿问题,如何排查和解决?
  • 【运维部署篇】OpenShift:企业级容器应用平台全面解析
  • Spring 的优势
  • Springboot集成Log4j2+MDC串联单次请求的日志
  • HBM Basic(VCU128)
  • 《Python基础》第3期:使用PyCharm编写Hello World
  • Leetcode-2080区间内查询数字的频率
  • 查看部署在K8S服务的资源使用情况
  • LOOP Finance:一场 Web3 共和国中的金融制度实验
  • 创维智能融合终端DT741_移动版_S905L3芯片_安卓9_线刷固件包
  • Linux驱动24 --- RkMedia 视频 API 使用
  • 前端保持和服务器时间同步的方法【使用vue3举例】
  • Tasks and Deadlines(Sorting and Searching)
  • Mysql-事务
  • Nginx入门:高性能Web服务器详解
  • 【图像算法 - 09】基于深度学习的烟雾检测:从算法原理到工程实现,完整实战指南
  • Claude Code实战体验:AI智能编程助手如何重塑开发工作流?
  • 2. JS 有哪些数据类型
  • Linux的NFS与Autofs配置指南
  • nodejs 编程基础01-NPM包管理
  • 最优化中常见的优化理论
  • Shader开发(七)创建第一个Shader项目
  • 游戏画面总是卡顿怎么办 告别延迟畅玩游戏