【Hot100】LeetCode—105. 从前序与中序遍历序列构造二叉树

news2024/9/21 2:38:07

目录

  • 1- 思路
    • 递归
  • 2- 实现
    • ⭐105. 从前序与中序遍历序列构造二叉树——题解思路
  • 3- ACM 实现


  • 原题连接:105. 从前序与中序遍历序列构造二叉树

1- 思路

递归

  • 前序:中左右
  • 中序:左中右

让前序的第一个元素作为中序的分割点
分割思路

  • 1- 递归参数与返回值(递归的指针是左闭右开的 也就是 [left,right) 的)
    • preOrder 前序数组;pLeft 中序数组左指针 用于切割;pRight:中序数组右指针 用于切割
    • inOrder前序数组;iLeft前序数组左指针 用于切割;iRight:前序数组右指针 用于切割
 TreeNode build(int[] preOrder,int pLeft,int pRight,int[] inOrder,int iLeft,int iRight)
  • 2- 终止条件
    • 两个 指针相遇时终止
  • 3- 树构造
  • 3.1 先找根:前序:中左右、中序:左中右,所以根节点一定是,前序数组的第一个元素
  • 3.2 去中序找 mid:用 iLeftiRight 去定位寻找,定位值为 mid
  • 3.3 中序数组拆分
    • iLfeft1 = iLfeft;
    • iRight1 = mid;
    • iLeft2 = mid+1;
    • iRight2 = iRight;
  • 3.4 前序数组拆分
    • pLeft1 = pLeft+1;
    • pRight1 = pLeft + (mid-iLeft1)+1;
    • pLeft2 = pRight1;
    • pRight2 = pRight;
  • 3.5 递归实现
    • 递归构造当前根节点的左子树和右子树
    • 左子树构造:root.left = build(preOrder,pLeft1,pRight1,inOrder,iLfeft1,iRight1);
    • 右子树构造:root.right = build(preOrder,pLeft2,pRight2,inOrder,iLfeft2,iRight2);

2- 实现

⭐105. 从前序与中序遍历序列构造二叉树——题解思路

在这里插入图片描述

/**
 * Definition for a binary tree node.
 * 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;
 *     }
 * }
 */
class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if(inorder.length==0){
            return null;
        }
        return build(preorder,0,preorder.length,inorder,0,inorder.length);
    }

    public TreeNode build(int[] preorder,int pLeft,int pRight,int[] inorder,int iLeft,int iRight){
        
        // 终止条件
        if(pLeft == pRight){
            return null;
        }
        
        // 找根
        int rootVal = preorder[pLeft];
        TreeNode root = new TreeNode(rootVal);

        // 定位mid
        int mid = 0;
        for(mid=iLeft ; mid<iRight;mid++){
            if(inorder[mid]==rootVal){
                break;
            }
        }

        // 拆中序
        int iLeft1 = iLeft;
        int iRight1 = mid;
        int iLeft2 = mid+1;
        int iRight2 = iRight;

        // 拆前序
        int pLeft1 = pLeft+1;
        int pRight1 = pLeft+(mid-iLeft1)+1;
        int pLeft2 = pRight1;
        int pRight2 = pRight;

        // 构造
        root.left = build(preorder,pLeft1,pRight1,inorder,iLeft1,iRight1);
        root.right = build(preorder,pLeft2,pRight2,inorder,iLeft2,iRight2);
        return root;
    }
}

3- ACM 实现

public class buildTree {

    public static 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 static TreeNode buildBy(int[] preOrder,int[] inOrder){
        // 调用递归build
        return build(preOrder,0,preOrder.length,inOrder,0,inOrder.length);
    }

    // 递归实现
    public static TreeNode build(int[] preOrder,int pLeft,int pRight,int[] inOrder,int iLeft,int iRight){
        //1. 终止条件
        if(pLeft==pRight){
            return null;
        }

        // 2. 构造根节点
        int rootVal = preOrder[pLeft];
        TreeNode root = new TreeNode(rootVal);

        // 3.定位mid
        int mid = 0;
        for(mid = iLeft;mid<iRight;mid++){
            if(inOrder[mid]==rootVal){
                break;
            }
        }

        // 拆分中序
        int iLeft1 = iLeft;
        int iRight1 = mid;
        int iLeft2 = mid+1;
        int iRight2 = iRight;

        // 拆分前序
        int pLeft1 = pLeft+1;
        int pRight1 = pLeft+(mid-iLeft1)+1;
        int pLeft2 = pRight1;
        int pRight2 = pRight;

        // 递归构造
        root.left = build(preOrder,pLeft1,pRight1,inOrder,iLeft1,iRight1);
        root.right = build(preOrder,pLeft2,pRight2,inOrder,iLeft2,iRight2);
        return root;
    }

    static List<List<Integer>> res = new ArrayList<>();
    public static List<List<Integer>> levelOrder(TreeNode root) {
        if(root==null){
            return res;
        }
        // 队列
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            int len = queue.size();
            List<Integer> path = new ArrayList<>();
            while(len>0){
                TreeNode nowNode = queue.poll();
                path.add(nowNode.val);
                if(nowNode.left!=null) queue.offer(nowNode.left);
                if(nowNode.right!=null) queue.offer(nowNode.right);
                len--;
            }
            res.add(new ArrayList<>(path));
        }
        return res;
    }



    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String[] pOrder =  sc.nextLine().replace("[","").replace("]","").split(",");
        String[] iOrder = sc.nextLine().replace("[","").replace("]","").split(",");
        int[] pNum = new int[pOrder.length];
        int[] iNum = new int[iOrder.length];
        for(int i = 0 ; i < pOrder.length;i++){
            pNum[i] = Integer.parseInt(pOrder[i]);
            iNum[i] = Integer.parseInt(iOrder[i]);
        }
        TreeNode root = buildBy(pNum,iNum);
        levelOrder(root);
        System.out.println("结果是"+res.toString());
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2070224.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

推荐一个java低代码开发平台-橙单

文章目录 前言一、项目介绍二、技术选型三、项目特点四、基础功能介绍五、源码下载六、官方文档总结 前言 大家好&#xff0c;今天为大家推荐一个开箱即用&#xff0c;快速开发的低代码平台。项目采用 Boot3 Flowable7 Sa-Token Vue3技术栈。 一、项目介绍 橙单中台化低代…

如何使用ssm实现基于SSM框架云趣科技客户管理系统

TOC ssm079基于SSM框架云趣科技客户管理系统jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff…

Android compose OutlinedTextField 点击事件

点击 OutlinedTextField 响应点击事件 再OutlinedTextField外层包裹ExposedDropdownMenuBox&#xff0c;重要的是让点击事件关联 readOnly true,Modifier.menuAnchor()

[CLIP-VIT-L + Qwen] 多模态大模型源码阅读 - MultiModal篇

[CLIP-VIT-L Qwen] 多模态大模型源码阅读 - MultiModal篇 前情提要源码阅读导包逐行讲解 dataclass部分整体含义逐行解读 模型微调整体含义逐行解读 MultiModal类整体含义逐行解读 参考repo:WatchTower-Liu/VLM-learning; url: VLLM-BASE 前情提要 有关多模态大模型架构中的…

机器学习预处理

一、数据读取 数据的读取方式有多种&#xff0c;最终我们可以转化为numpy和pandas形式储存&#xff0c;方便后续的模型建立。 1.1 读取库的安装 需要用到的三个库 pip install pandas pip install numpy pip install openpyxl 1.2 库的使用 import pandas as pd ​ #### 1…

面向对象编程:深入PHP的封装、继承和多态性!

文章目录 面向对象OOP的核心概念定义类、创建对象构造函数和析构函数访问修饰符继承方法重写接口和抽象类静态方法和属性魔术方法 错误处理错误处理概述错误级别异常处理自定义异常设置错误处理忽略错误错误日志断言 总结 面向对象编程&#xff08;OOP&#xff09;是一种编程范…

设计资讯 | 这款受数学方程启发的平板桌:配集成黑胶唱片机和无线充电器

早在 1903 年&#xff0c;英国数学家亨利欧内斯特杜德尼就想出了将正方形变形为等边三角形的方法。这个技巧是将正方形分割成可重新排列的四个不同形状。这种方法经过一个多世纪的各种应用&#xff0c;仍然具有价值。 1986 年&#xff0c;建筑师 David Ben-Grunberg 和他的艺术…

加速打开gtihub的工具dev-sidecar

加速github&#xff0c;git clone&#xff0c; pip install 直接上工具链接 dev-sidecar code: https://github.com/docmirror/dev-sidecar dev-sidecar releases: https://github.com/docmirror/dev-sidecar/releases 不想看code的&#xff0c;直接点击 dev-sidecar releases…

Leetcode 1108. IP地址无效化

Leetcode 1108. IP 地址无效化 问题&#xff1a;给你一个有效的 IPv4 地址address&#xff0c;返回这个 IP 地址的无效化版本。 所谓无效化 IP 地址&#xff0c;其实就是用 "[.]" 代替了每个 "."。 方法1&#xff1a;对字符串挨个进行判断&#xff0c;如…

C语言 ——— 经典有关动态内存的笔试题

目录 笔试题1 笔试题2 笔试题3 笔试题1 代码演示&#xff1a; #include<stdio.h> #include<string.h> void GetMemory(char* p) {p (char*)malloc(100); } void Test() {char* str NULL;GetMemory(str);strcpy(str, "hello world");printf("…

计算机Java项目|基于SpringBoot的周边游平台设计与实现

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参…

Gameplay Ability System(事件通知)

一、打开角色蓝图BP_BaseCharacter添加节点 1、添加Send Gameplay Event to Actor节点&#xff0c;当玩家的武器碰到敌人时发送GameplayEvent。 2、给该事件添加Event Tag标签&#xff1a;Ability.MeleeAttack.Damage.Event。 3、通过Make GameplayEventData给事件添加Payload…

图解计算机网络:一条 HTTP 请求的网络拓扑之旅

引言 常见的网络拓扑结构如下图所示&#xff1a; 在此拓扑中&#xff0c;终端设备通过 WiFi 连接到路由器&#xff0c;路由器再连接到光猫&#xff08;或终端设备通过移动网络 4G/5G 连接到基站&#xff09;&#xff0c;之后 ISP 网络服务提供商接管网络通信&#xff0c;将请求…

电脑如何录屏?高清录制教程来袭,快收藏!

在数字化时代&#xff0c;电脑录屏已经成为了我们学习和工作中的一项重要技能。如果你想知道电脑如何录屏&#xff0c;这里有几个简单的方法可以帮助你开始。 一、福昕网课录制大师 虫洞 https://www.foxitsoftware.cn/REC/ 这个软件因为又专业又好上手&#xff0c;挺受大家…

LaTex插入图片

LaTeX 提供了许多定制化图片的功能。这篇文章将会介绍如何用最常见的格式插入图片、缩放图片以及如何在文档中引用这些图片。 1.基本使用 效果图如图所示。 \documentclass{article} \usepackage{graphicx} \graphicspath{ {./figure/} }\begin{document}\begin{figure}[!t]…

排序(归并排序,非比较排序)

归并排序 归并排序&#xff08;MERGE-SORT&#xff09;是建⽴在归并操作上的⼀种有效的排序算法,该算法是采⽤分治法&#xff08;Divide and Conquer&#xff09;的⼀个⾮常典型的应⽤。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有序&…

《深入浅出WPF》读书笔记.6binding系统(中)

《深入浅出WPF》读书笔记.6binding系统(中) 背景 这章主要讲各种模式的数据源和目标的绑定。 代码 把控件作为Binding源与Binding标记扩展 方便UI元素之间进行关联互动 <Window x:Class"BindingSysDemo.BindingEle"xmlns"http://schemas.microsoft.com…

IP打开“向下”空间,爱奇艺“摊牌了”

长视频领域上半年竞争激烈、好剧频出&#xff0c;让行业焕发了新的吸引力&#xff0c;优质内容对行业的正向引导作用持续凸显。正如爱奇艺创始人、CEO龚宇最新的发言&#xff1a;“长视频行业实现长期发展的关键在于优质内容供给的持续性&#xff0c;以及内容质量和商业收益的双…

页面设计任务 商品详情页

目录 成品: 任务描述 源码&#xff1a; 详细讲解&#xff1a; 1.导航栏讲解 2.主体部分 3.图像部分 4.评分部分 5.按钮部分 6.配置信息部分 7.响应式设计 成品: 任务描述 创建一个产品展示页面&#xff0c;包括以下内容&#xff1a; 网页结构&#xff1a;使用 HTM…

选择适合的电脑监控软件,可以提升员工效率

在信息化时代&#xff0c;企业对员工的管理不再仅限于传统的考勤制度和绩效评估。随着工作方式的多样化&#xff0c;特别是远程办公的普及&#xff0c;电脑监控软件成为企业管理的重要工具。这些软件不仅能帮助管理者了解员工的工作状态&#xff0c;还能有效提升工作效率&#…