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

news/2025/3/6 11:02:52/

leetcode 106
在这里插入图片描述

思路

中序遍历:左中右
后序遍历:左右中
那么可以知道后序遍历最后一个值一定是根节点,因为最后遍历中间节点,中间节点就是根节点,知道中间点,就能将中序数组进行切割,以中间节点为分割点,左边就是左子树,右边就是右子树,也就是题目中的inorder可以切割为leftTree = [9] rightTree = [15,20,7]
然后再切割后序遍历,右子树是左右中,左子树的长度是和中序遍历左子树的长度是一样的,所以也可以进行切割leftTree = [9] rightTree = [15,7,20]
然后对于左子树和右子树,继续进行递归遍历,知道右子树只有一个值的时候,说明已经到叶子节点,所以结束递归,最终把root值返回

实现

class TreeNode {constructor(val) {this.val = val;this.left = null;this.right = null;}
}
var buildTree = function (inorder, postorder) {const deep = (inorder, postorder) => {if(!postorder.length) return null;if (postorder.length === 1) {return new TreeNode(postorder[0])}// 根节点是后序数组的最后一位const rootVal = postorder[postorder.length - 1]let root = new TreeNode(rootVal)// 切割前序数组,获取左子树节点和右子树节点const index = inorder.indexOf(rootVal)// 前序左孩子const inorderarr1 = inorder.slice(0, index)// 前序右孩子const inorderarr2 = inorder.slice(index + 1)// 切割后序数组,后序数组的左子树,跟前序的左孩子长度相等const postorderarr1 = postorder.slice(0, inorderarr1.length)const postorderarr2 = postorder.slice(inorderarr1.length, postorder.length - 1)root.left = deep(inorderarr1, postorderarr1)root.right = deep(inorderarr2, postorderarr2)return root;}return deep(inorder, postorder)
};

扩展

除了可以使用中序和后序来确定二叉树,使用前序和中序也可以确定一棵二叉树,也是同样的方法
leetcode 105 从前序与中序遍历序列构造二叉树
前序:中左右
中序:左中右
那么前序的第一个值就是根节点,也同样可以把中序的左子树和右子树拆分开
但是⚠️:前序和后序不能确定一棵二叉树
前序:中左右
后序:左右中
那么我们知道前序的第一个数是根节点,后序的最后一个数是根节点,但是前序和后序的左右子树都挨着的,我们无法进行拆分,所以不能解析出来二叉树

前序中序构造二叉树实现

class TreeNode {constructor(val) {this.val = val;this.left = null;this.right = null;}
}
var buildTree = function (preorder, inorder) {if (!preorder) return null;const deep = (preorder, inorder) => {if(!preorder.length) return null;if (preorder.length === 1) {return new TreeNode(preorder[0])}const rootVal = preorder[0]let root = new TreeNode(rootVal)// 中序切割const index = inorder.indexOf(rootVal);// 中序左子树const inorderArr1 = inorder.slice(0, index)// 中序右子树const inorderArr2 = inorder.slice(index + 1)// 前序切割const preorderArr1 = preorder.slice(1, 1 + inorderArr1.length)const preorderArr2 = preorder.slice(1 + inorderArr1.length)root.left = deep(preorderArr1, inorderArr1)root.right = deep(preorderArr2, inorderArr2);return root;}return deep(preorder, inorder)
};

http://www.ppmy.cn/news/1577048.html

相关文章

永磁直驱式风力发电虚拟同步机仿真模型Matlab/Simulink模型

很久没有分享虚拟同步机控制相关的方向了,毕业后在电科院的项目又有所接触。这个课题方向其实作为硕士毕业课题还是够用的,相对来说也是比较容易毕业的,因为涉及的分支比较多。 后续对虚拟同步机的控制,我就延续我前面博客提到的方…

AI浪潮下的软件工程师:如何在变革中突破自我,掌握AI技术

AI浪潮下的软件工程师:如何在变革中突破自我,掌握AI技术 引言 随着人工智能(AI)技术的飞速发展,各行各业都在经历前所未有的变革。软件工程师作为技术领域的核心力量,面临着新的挑战和机遇。本文将探讨在…

Blender常用快捷键的汇总

一、基础操作 全选/取消全选:A(全选)、AA(连续按两次A取消全选)复制物体:Shift D(复制后需点击确认位置)移动物体:G(按X/Y/Z可约束轴向移动)旋转…

*pu相关概念介绍

1. TPU(张量处理单元)​ ​定义:TPU(Tensor Processing Unit)是谷歌开发的专用芯片,针对机器学习中的张量运算进行优化,尤其擅长加速神经网络训练和推理​核心特点: ​架构:采用脉动阵列(systolic array)设计,数据像“脉搏”一样流动,减少内存访问延迟,高效处理矩…

低代码+AI双重革命:传统软件开发的破局与重生

引言:当代码不再是护城河 某金融科技公司技术总监最近发现: 5人开发团队使用AI低代码平台,3天完成原需2个月的信贷风控系统自动生成的代码单元测试覆盖率高达85%,远超人工开发的62%系统迭代时仅需修改流程图,AI自动完成关联代码更新这场由低代码与AI共同驱动的技术革命,…

c++ std::tuple用法

向 std::vector<std::tuple<double, int>> edges 中添加数据可以通过以下方法实现&#xff1a; 1. 使用 push_back 和 std::make_tuple #include <vector> #include <tuple>// 假设已经声明了 edges std::vector<std::tuple<double, int>&g…

Franka机器人FR3快速安装指南

获取英语和其他语言的手册和 其他支持材料。关注PNP机器人 Franka Research 3 FR3机器人 安装快速指南 本指南将指导您 通过本产品手册的各个步骤&#xff0c; 以启动并运行系统。 文档编号&#xff1a;R02040 发行版本&#xff1a;1.1 英文文档是原版文档。 其他语言是…

Qt:文件

目录 前言 QFile的使用 QFileInfo的使用 前言 关于文件相关操作&#xff0c;之前也学习过很多&#xff1a; C语言中 fopen 打开文件 fread fwrite 读写文件 fclose 关闭文件C中 fstream 打开文件 << >> 读写文件 close 关闭文件Linux中 open 打开文件 read wr…