首页 > 编程语言 >剑指 Offer 07. 重建二叉树(java解题)

剑指 Offer 07. 重建二叉树(java解题)

时间:2023-03-21 10:34:13浏览次数:56  
标签:遍历 TreeNode 07 int 前序 二叉树 java root 节点

目录

1. 题目

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

示例 1:
示例

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]
示例 2:

Input: preorder = [-1], inorder = [-1]
Output: [-1]

限制:

0 <= 节点个数 <= 5000

作者:Krahets
链接:https://leetcode.cn/leetbook/read/illustration-of-algorithm/99lxci/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2. 解题思路

个人思路

每次查找前序遍历的节点0作为root节点,在中序遍历中查找root节点所在位置,根据位置下标i将中序遍历数组分为左右两个左右子数组[0,i-1][i+1,len-1],对前序遍历数组,根据左右子树组的长度相同同样进行分组划分,然后递归调用函数,处理左右子树。

3. 数据类型功能函数总结

//数组
int[] array_name=new int[len];//数组定义
int len=array_name.length;//获得数组长度

4. java代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if(preorder.length==0&&inorder.length==0){//特殊情况,也是递归的边界条件
            return null;
        }
        else{
            //构造根节点
            int root_val=preorder[0];//前序遍历的首元素为根节点的值
            TreeNode root=new TreeNode(root_val);//创建根节点
            //在中序遍历数组中查找根节点位置
            int find_root=0;
            int i=0;
            for(i=0;i<inorder.length&&find_root==0;i++){
                if(inorder[i]==root_val){
                    find_root=1;
                }
            }//此时得到下标i+1,[0,i-1][i][i+1,len-1]
            //数组二分
            i--;
            int[] left_inorder=new int[i];
            int[] right_inorder=new int[inorder.length-i-1];
            int[] left_preorder=new int[i];
            int[] right_preorder=new int[inorder.length-i-1];
            for(int j=0;j<i;j++){
                left_inorder[j]=inorder[j];
                left_preorder[j]=preorder[j+1];
            }
            for(int j=i+1;j<inorder.length;j++){
                right_inorder[j-i-1]=inorder[j];
                right_preorder[j-i-1]=preorder[j];
            }
            //递归调用
            root.left= buildTree(left_preorder, left_inorder);
            root.right= buildTree(right_preorder, right_inorder);
            return root;
        }
    }
}

标签:遍历,TreeNode,07,int,前序,二叉树,java,root,节点
From: https://www.cnblogs.com/CrazyPixel/p/17239040.html

相关文章

  • Java之JasyptUtil类的使用
    在配置文件中,我们通常会对中间件密码进行加密。手动加密可以使用JasyptUtil类,代码如下:packagecom.cmit.kapok.system.utils;importorg.jasypt.encryption.pbe.Standa......
  • Java生成随机日期
    publicclassDateRandomTest{//返回2007-01-01到2007-03-01的一个随机日期publicstaticvoidmain(String[]args){DaterandomDate=r......
  • Can not set java.lang.String field com.jsedc.log.pojo.entity.voSyslogV0.happenT
    未加泛型约束的result,其List中的实体对象会被序列化为LinkedHashMap,实际结构为Result<List<LinkedHashMap<String,String>>>导出excel时对象赋值失败......
  • 代码随想录21 530.二叉搜索树的最小绝对差 | 501.二叉搜索树中的众数 | 236. 二
    530. 二叉搜索树的最小绝对差给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。差值是一个正数,其数值等于两值之差的绝对值。classS......
  • Javaweb学习-书城项目相关
    资料来源于:B站尚硅谷JavaWeb教程(全新技术栈,全程实战),本人才疏学浅,记录笔记以供日后回顾由于是多个视频内容混合在一起,因此只放了第一个链接本文参考价值不高,随便写写......
  • 07linux启动文件添加环境变量
    添加一个环境变量场景vi/etc/profile  在文件最后面添加(如下是go执行的路径)exportPATH=$PATH:/usr/local/go/bin添加多个,路径与路径用:隔开 ......
  • JAVA -适合新手和复习(Restart)
    作为22届专科生,在没有经历和学历的情况下找一份得体的工作 是多么“奢侈”,世上岂无千里马,人中难得九方皋.废话太多我们开始吧!JAVA从这里开始 Java的历史(不感兴趣直......
  • 值得收藏的Java 命名规范参考!
    一、Java中常用到的命名形式共有三种既首字母大写的UpperCamelCase,首字母小写的lowerCamelCase以及全部大写的并用下划线分割单词的UPPERCAMELUNSER_SCORE。通常约定,类一......
  • Linux启动Java程序jar包Shell脚本
    手动方式启动和终止java程序启动java程序jar:nohupjava-jarXXX.jar查看程序占用pid:ps-ef|grepXXX.jar或jpsjps是jdk提供的一个查看当前java进程的小工具,查询Lin......
  • javascript 学习笔记
     JavaScript是区分大小写的,并使用Unicode字符集在JavaScript中,指令被称为语句(Statement),并用分号(;)进行分隔如果一条语句独占一行的话,那么分号是可以省略的。(译者......