当前位置: 首页 > 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);}
}

相关文章:

  • 本地化部署HomeAssistant语音助手并接入DeepSeek
  • 波导模型(表面等离激元、石墨烯等)本征模式分析、各种类型波导传输效率求解
  • JAVA数组题(7)
  • STL - stack 和 queue 及容器适配器模式的介绍
  • C++11(2)
  • 大语言模型三大演进方向:记忆增强、工具集成与多模态突破
  • 插件双更新:LeetCode 刷题支持正式上线,JetBrains IDE 插件持续升级!
  • 《从零开始入门递归算法:搜索与回溯的核心思想 + 剑指Offer+leetcode高频面试题实战(含可视化图解)》​
  • 机器学习第十三讲:独热编码 → 把“红黄蓝“颜色变成001/010/100的数字格式
  • 将.pt文件执行图像比对
  • 赛博放生:用数字技术重构心灵仪式
  • 跨系统数据烟囱如何破局?豪森智源HSMES重构制造协同新范式‌
  • AI全域智能监控系统重构商业清洁管理范式——从被动响应到主动预防的监控效能革命
  • 数据科学和机器学习的“看家兵器”——pandas模块 之四
  • 上线前测试组发现问题较多。开发总结
  • 数控机床控制单元技术方案:基于EFISH-SCB-RK3588/SAIL-RK3588的赛扬N100/N150国产化替代全场景解析
  • c++从入门到精通(四)--动态内存,模板与泛型编程
  • 小白入门:GitHub 远程仓库使用全攻略
  • 印度全印度游戏联合会(AIGF)介绍与用途
  • 基于YOLOv5的葡萄病害智能识别系统开发实践
  • 泽连斯基:乌代表团已启程,谈判可能于今晚或明天举行
  • 商务部:中方将适时发布中美经贸磋商相关消息
  • 美国明尼苏达州发生山火,过火面积超80平方公里
  • 美国4月CPI同比上涨2.3%低于预期,为2021年2月来最小涨幅
  • 支持企业增强战略敏捷更好发展,上海市领导密集走访外贸外资企业
  • 夜读丨取稿费的乐趣