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

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

https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/?envType=study-plan-v2&envId=top-interview-150

思路:我们知道后序的顺序是左右根,所以后序数组的最后一个一定是根节点,然后中序是左根右,我们就可以拿着找到的根节点将中序分为两部分,这两部分分别是左子树和右子树,我们可以得到左右子树的节点个数,这样我们就可以在后序数组中找到对应的部分,然后对每部分分别执行上述操作。

class Solution {public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val = val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}}public TreeNode buildTree(int[] inorder, int[] postorder) {if(inorder.length == 0 || postorder.length == 0)return null;return method(inorder, postorder, 0, inorder.length - 1, 0, postorder.length - 1);}public TreeNode method(int[] inorder, int[] postorder, int inorderStart, int inorderEnd, int postorderStart, int postorderEnd) {// 找到传入部分的根节点TreeNode node = new TreeNode(postorder[postorderEnd]);// 只有一个节点的时候返回if(inorderStart == inorderEnd) {return node;}int inorderNextStart_L = 0, inorderNextEnd_L = 0; // 当前节点的左子树在中序中的下标范围int inorderNextStart_R = 0, inorderNextEnd_R = 0; // 当前节点的右子树在中序中的下标范围int postorderNextStart_L = 0, postorderNextEnd_L = 0; // 当前节点的左子树在后序中的下标范围int postorderNextStart_R = 0, postorderNextEnd_R = 0; // 当前节点的右子树在后序中的下标范围// 找到根节点在中序中的位置for(int i = inorderStart; i <= inorderEnd; i++) {if(inorder[i] == postorder[postorderEnd]) {inorderNextStart_L = inorderStart;inorderNextEnd_L = i - 1;inorderNextStart_R = i + 1;inorderNextEnd_R = inorderEnd;break;}}// 找到右子树在后序中的下标范围(因为右子树靠近根,我们可以通过长度直接得到范围)int rightTreeSize = inorderNextEnd_R - inorderNextStart_R + 1;postorderNextEnd_R = postorderEnd - 1;postorderNextStart_R = postorderNextEnd_R - rightTreeSize + 1;postorderNextStart_L = postorderStart;postorderNextEnd_L = postorderNextStart_R - 1;//传入左子树部分(注意范围,不要越界)if(check(inorderNextEnd_L, inorderStart, inorderEnd) && check(inorderNextStart_L, inorderStart, inorderEnd) && check(postorderNextEnd_L, postorderStart, postorderEnd) && check(postorderNextStart_L, postorderStart, postorderEnd))node.left = method(inorder, postorder, inorderNextStart_L, inorderNextEnd_L, postorderNextStart_L, postorderNextEnd_L);//传入右子树部分if(check(inorderNextEnd_R, inorderStart, inorderEnd) && check(inorderNextStart_R, inorderStart, inorderEnd) && check(postorderNextEnd_R, postorderStart, postorderEnd) && check(postorderNextStart_R, postorderStart, postorderEnd))node.right = method(inorder, postorder, inorderNextStart_R, inorderNextEnd_R, postorderNextStart_R, postorderNextEnd_R);return node;}public boolean check(int x, int l, int r) {return x >= l && x <= r;}public static void main(String[] args) {int[] inorder = {2,1};int[] postorder = {2,1};new Solution().buildTree(inorder, postorder);}
}

http://www.xdnf.cn/news/464905.html

相关文章:

  • 【206】VS2022 C++ 实现无符号32位整数和IP地址字符串互相转换
  • element-ui的el-cascader增加全选按钮实现(附源码)
  • DB-GPT扩展自定义app配置说明
  • 【网络编程】九、详解 HTTPS 加密原理
  • 鸿蒙 ArkUI - ArkTS 组件 官方 UI组件 合集
  • AEO认证的好处 ,如何快速获取AEO认证?
  • Java应用OOM排查:面试通关“三部曲”心法
  • android display 笔记(十四)VAU 和GSP 分别代表什么
  • fpga系列 HDL : Microchip FPGA开发软件 Libero Soc 安装 license申请
  • 企业级Javaweb开发常用注解
  • macOS中5000端口被控制中心占用问题
  • 洛谷P4907题解
  • Milvus(23):过滤
  • 《Python星球日记》 第81天:回看图像生成与风格迁移
  • Python机器学习笔记(二十三 模型评估与改进-网格搜索)
  • AcroForm 文档(打开时)级脚本对比 Excel VBA 参考
  • 关于多线程的Redis模型
  • 数据科学和机器学习的“看家兵器”——pandas模块 之二
  • c++从入门到精通(四)--动态内存,模板与泛型编程
  • python克洛伊婚纱摄影预约管理系统
  • P2679 [NOIP 2015 提高组] 子串
  • Linux之Yum源与Nginx服务篇
  • Node.js 安装 + React Flow 快速入门:环境安装与项目搭建
  • Spring Boot 和 Jedis版本搭配的建议
  • 【言语】刷题5
  • win11平台下的docker-desktop中的volume位置问题
  • Newtonsoft.Json.JsonSerializationException
  • 安卓A15系统实现修改锁屏界面默认壁纸功能
  • 多个docker-compose-xx 停止并完全卸载 删除
  • C++:字符数组与字符串指针变量的大小