Leetcode JAVA刷刷站(106)从中序与后序遍历序列构造二叉树

devtools/2024/12/22 20:29:11/

一、题目概述

二、思路方向 

       在Java中,根据给定的中序遍历(inorder)和后序遍历(postorder)数组来构造二叉树是一个相对常见的问题。基本思路是,后序遍历的最后一个元素总是当前子树的根节点。然后,在中序遍历中找到这个根节点的位置,它将中序遍历分为左子树和右子树。接下来,我们可以递归地构建左子树和右子树。

具体的步骤:

  1. 递归基:如果中序遍历或后序遍历数组为空,则返回null,表示空树。

  2. 找到根节点:后序遍历数组的最后一个元素是当前子树的根节点。

  3. 分割中序遍历:在中序遍历中找到根节点的位置,它将中序遍历分为左子树和右子树的部分。

  4. 递归构建子树:使用分割后的中序遍历数组和后序遍历数组(去掉最后一个元素,即根节点)来递归构建左子树和右子树。

  5. 创建并连接节点:使用根节点值创建新的树节点,并将递归构建的左子树和右子树连接到该节点上。

三、代码实现 

java">class TreeNode {  int val;  TreeNode left;  TreeNode right;  TreeNode(int x) {  val = x;  }  
}  public class Solution {  public TreeNode buildTree(int[] inorder, int[] postorder) {  if (inorder == null || postorder == null || inorder.length != postorder.length) {  return null;  }  return buildTreeHelper(inorder, 0, inorder.length - 1, postorder, 0, postorder.length - 1);  }  private TreeNode buildTreeHelper(int[] inorder, int inStart, int inEnd, int[] postorder, int postStart, int postEnd) {  if (inStart > inEnd || postStart > postEnd) {  return null;  }  // 后序遍历的最后一个元素是根节点  int rootVal = postorder[postEnd];  TreeNode root = new TreeNode(rootVal);  // 在中序遍历中找到根节点的位置  int rootIndexInorder = inStart;  while (inorder[rootIndexInorder] != rootVal) {  rootIndexInorder++;  }  // 递归构建左子树和右子树  int leftSubtreeSize = rootIndexInorder - inStart;  root.left = buildTreeHelper(inorder, inStart, rootIndexInorder - 1, postorder, postStart, postStart + leftSubtreeSize - 1);  root.right = buildTreeHelper(inorder, rootIndexInorder + 1, inEnd, postorder, postStart + leftSubtreeSize, postEnd - 1);  return root;  }  
}

执行结果: 

四、小结 

       这段代码首先检查输入数组的有效性,然后调用buildTreeHelper方法进行递归构建。在buildTreeHelper方法中,首先检查递归的终止条件(即子数组为空时),然后找到后序遍历的最后一个元素作为根节点,并在中序遍历中找到该根节点的位置,以此分割中序遍历数组。最后,递归地构建左子树和右子树,并将它们连接到根节点上。

 结语 

宁恋本乡一捻土

莫爱他乡万两金

!!!


http://www.ppmy.cn/devtools/107722.html

相关文章

[UVM]6.component driver monitor sequencer agent scoreboard env test

1.知识点回顾 (1)component需要有parent,因为参加构成组件,所以需要(继承); (2)object与component之间间隔report_object。 2.组件家族 (1)构建…

广义回归神经网络(GRNN)

一、简介 广义回归神经网络 (General Regression Neural Network , GRNN) 的概念是由德 国科学家多纳德提出的,是径向基网络的其中一种 。因为其是以数理统计为基 础的,因此 GRNN 可以依据样本数据逼近其中包含的非线性映射关系。即使样本 数…

如何使用Linux命令行创建文件

可以使用命令行中的 touch 或 echo 命令来创建一个名为 main.rs 的文件。以下是两种方法: 方法 1:使用 touch 命令 touch 命令用于创建一个空文件。运行以下命令来创建 main.rs 文件: touch main.rs这将在当前目录下创建一个名为 main.rs …

Day11_0.1基础学习MATLAB学习小技巧总结(11)——程序流程控制2

利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍,为了在这个过程中加深印象,也为了能够有所足迹,我会把自己的学习总结发在专栏中,以便学习交流。 素材来源“数学建模清风” 特此说明:本博客的内容只在于总结在…

戴尔 Latitude5290 平板上手笔记

想搞个Windows 平板平时带着方便,比安卓平板更泛用,戴尔这个二手九成新机器价格还不错,七百块咸鱼上捡回来个二手。虽然用7 代CPU 的5285 价格更便宜,但是我觉得还是上8 代i5 吧,因为还记得当年说8 代更新牙膏挤了挺多…

[Unity3D]胡闹厨房复刻笔记

完整笔记内容点击https://kokoollife.github.io/查看。 部分内容 02 简陋实现 001 玩家控制器 [1]简单移动 a:逻辑与动画分离 b:新建脚本Player.cs using UnityEngine;public class Player : MonoBehaviour {//私有就保证不被其他脚本修改该变量,序列化保证我…

服务器安装pytorch-阿里云-centos7

原文阅读:【巨人肩膀社区专栏分享】服务器安装pytorch-阿里云-centos7 1、创建一个虚拟环境 conda create -n pytorch python3.10 安装成功:   但是使用上面的命令会失败(疑问?&#xf…

顶级域名服务器 - TLD服务器

TLD服务器(顶级域名服务器)是负责管理互联网域名系统(DNS)中所有顶级域名(Top-Level Domains, TLDs)的DNS记录的服务器。顶级域名是域名层级结构中的最高级别,位于域名的最右侧,例如…