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

题目

105. 从前序与中序遍历序列构造二叉树

分析

这道题是告诉我们一颗二叉树的前序和中序,让我们根据前序和中序构造出整颗二叉树。

拿到这道题,我们首先要知道前序的中序又怎样的性质:

  • 前序:【根 左 右】
  • 中序:【左 根 右】

根据以上的性质,我们可以得到以下的结论:

  • 前序遍历的第一个元素一定为数的根节点node的值。
  • 因为题目告诉了我们无重复元素,所以在中序遍历中找到根节点 node 的索引,可以将 中序遍历的数组 划分为 [左子树 | 根节点 | 右子树] 的形式。
  • 在中序遍历数组中我们可以知道以 node 为根节点,左右子树的节点个数,利用这点可以将 前序遍历数组 划分为 [根节点 | 左子树 | 右子树]。
  • 通过上面我们可以知道整颗树的树根,左子树,右子树。下面需要分别构建左子树、右子树,还是按照上面的逻辑。

接下来的问题就是需要知道构建左子树和右子树的时候的前序序列和中序序列。

  • 根节点的值为 preorder[0],然后在中序序列中找到这个节点下标为 inorderIndex
  • 构建左子树:

左子树的 preorder:[1,inorderIndex + 1)
左子树的 inorder :[0,inorderIndex )

  • 构建右子树:

右子树的 preorder:[inorderIndex+1,preorder.length)
右子树的 inorder :[inorderIndex+1,inorder.length)

下面我来举个例子:
在这里插入图片描述

代码

/*** 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(preorder.length == 0) return null;int rootValue = preorder[0];int inorderIndex = -1;for(int i = 0;i < inorder.length;i ++) {if(inorder[i] == rootValue) {inorderIndex = i;break;}}TreeNode rootNode = new TreeNode(rootValue);rootNode.left = buildTree(Arrays.copyOfRange(preorder,1,inorderIndex+1),Arrays.copyOfRange(inorder,0,inorderIndex));rootNode.right = buildTree(Arrays.copyOfRange(preorder,inorderIndex+1,preorder.length),Arrays.copyOfRange(inorder,inorderIndex+1,inorder.length));return rootNode;}
}

在这里插入图片描述

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

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

相关文章

大模型相关(CPU与GPU和模型的蒸馏)

CPU与GPU上的运行效率差异 GPU上运行的两层3x3卷积层确实可以比一层5x5卷积层更快&#xff0c;而在CPU上情况可能正好相反。 原因&#xff1a;&#xff08;1&#xff09;并行处理能力&#xff1a;GPU拥有成百上千个小核心&#xff0c;能够同时处理大量计算任务&#xff0c;这对…

Linux用到的命令

1 压缩文件 tar -czf wonderful.tar.gz pm 这个命令的作用就是创建一个以.tar.gz结尾的包文件&#xff0c;然后调用gzip程序将当前目录下的pm文件夹压缩到这个以.tar.gz结尾的文件里面去

【已解决】PPT无法复制内容怎么办?

想要复制PPT文件里的内容&#xff0c;却发现复制不了&#xff0c;怎么办&#xff1f; 这种情况&#xff0c;一般是PPT文件被设置了以“只读方式”打开&#xff0c;“只读方式”下的PPT无法进行编辑更改&#xff0c;也无法进行复制粘贴的操作。 想要解决这个问题&#xff0c;我…

Swift基础知识:30.Swift访问控制

在 Swift 中&#xff0c;访问控制&#xff08;Access Control&#xff09;是一种用于限制代码模块对其他代码模块的访问权限的机制。通过访问控制&#xff0c;可以控制代码中各个部分的可见性和可访问性&#xff0c;以便于提高代码的安全性、可维护性和可复用性。 访问级别 S…

激光雷达反光板算法总结

1 高反特征提取 首先,从雷达原始数据,提取到高反点;根据雷达的规格书提供的不同材料的强度,设定合适的阈值;;更优的方法是根据距离设定不同的阈值 2 反光板及反光柱的聚类 根据高反点是否连续进行聚类,同时结合距离及雷达的角度分辨率,计算出针对不同尺寸的反光板或反…

TypeScript 枚举----迭代器

类似Python中的enumerate test.ts /* * 枚举 迭代器 * 支持&#xff1a;Array, Tuple, Map, String * */ function * enumerate(obj: unknown, start: number0){// Array or Tupleif (Array.isArray(obj)){let num startfor (let j of obj){yield [num, j]num 1}// Map}els…

多任务互斥及队列

一.互斥的引入 在FreeRTOS中&#xff0c;互斥&#xff08;Mutex&#xff09;是一种用于保护共享资源的机制。互斥锁可以确保同一时间只有一个任务能够访问共享资源&#xff0c;从而避免了竞态条件和数据不一致的问题。 FreeRTOS中互斥的引入方法&#xff1a; 创建互斥锁&#…

机器无root权限源码安装zsh

文章目录 1\. 下载并安装 ncurses2\. 下载并安装 zsh3\. 设置 zsh 为默认启动也可以更进一步安装 oh-my-zsh 很多情况下我们可能无法获取 机器的 root 超级用户权限&#xff0c;为了使用 zsh&#xff0c;我们可以自己独立使用源码编译安装并配置&#xff0c;只在自己的账号下使…

win10开机黑屏,explorer.exe文件找不到

一、问题 今天清理c盘时&#xff0c;不知道做了什么操作&#xff0c;把相关文件弄没了&#xff0c;然后电脑开机黑屏&#xff0c;进入不了桌面&#xff0c;能看见鼠标。 二、解决办法 网上搜了一些解决办法&#xff1a;ctrlshftdelete 打开任务管理器》运行新任务》输入expl…

MySQL数据库基础(十二):子查询(三步走)

文章目录 子查询&#xff08;三步走&#xff09; 一、子查询&#xff08;嵌套查询&#xff09;的介绍 二、子查询的使用 三、总结 子查询&#xff08;三步走&#xff09; 一、子查询&#xff08;嵌套查询&#xff09;的介绍 在一个 select 语句中,嵌入了另外一个 select …

JavaScript 中断请求的几种方法

中断Promise 中断Promise不等同于中止Promise,因为Promise是无法被终止的. 这里的中断指的是&#xff0c;在合适的时机&#xff0c;把pending状态的promise给reject掉。例如一个常见的应用场景就是给网络请求设置超时时间&#xff0c;一旦超时就中断。 还是用 setTimeout 来…

1027. 最长等差数列【leetcode】/动态规划

1027. 最长等差数列 给你一个整数数组 nums&#xff0c;返回 nums 中最长等差子序列的长度。 回想一下&#xff0c;nums 的子序列是一个列表 nums[i1], nums[i2], …, nums[ik] &#xff0c;且 0 < i1 < i2 < … < ik < nums.length - 1。并且如果 seq[i1] - …

《Linux C编程实战》笔记:消息队列

消息队列是一个存放在内核中的消息链表&#xff0c;每个消息队列由消息队列标识符标识。与管道不同的是消息队列存放在内核中&#xff0c;只有在内核重启&#xff08;即操作系统重启&#xff09;或显示地删除一个消息队列时&#xff0c;该消息队列才会被真正的删除。 操作消息…

OPPO公布全新AI战略,AI 手机时代再提速

2024年2月20日&#xff0c;深圳——今日OPPO 举办 AI 战略发布会&#xff0c;分享新一代 AI 手机的四大能力特征&#xff0c;展望由AI驱动的手机全栈革新和生态重构的趋势&#xff0c;并发布由OPPO AI 超级智能体和 AI Pro 智能体开发平台组成的OPPO 1N 智能体生态战略&#xf…

Android基础Adapter适配器详解

一、概念 Adapter是后端数据和前端显示UI的适配器接口。常见的View如ListView、GridView等需要用到Adapter. BaseAdapter&#xff1a;抽象类&#xff0c;实际开发中继承这个类并且重写相关方法&#xff0c;用得最多的一个Adapter&#xff01; ArrayAdapter&#xff1a;支持泛型…

人工智能数学验证工具LEAN4【入门介绍7】高级加法世界-如何进行分类讨论

视频链接&#xff1a;人工智能数学验证工具LEAN4【入门介绍7】高级加法世界-如何进行分类讨论_哔哩哔哩_bilibili import Game.Levels.AdvAddition.L05add_right_eq_zero World "AdvAddition" Level 6 Title "add_left_eq_zero" TheoremTab ""…

[知识点]务必记住isBlank和isEnpty的区别!!!

身为一个伟大的程序员,我不允许你不懂isBlank和isEmpty的区别 正文 StrUtil.isBlank(message)和StrUtil.isEmpty(message)这两个方法都是用来检查一个字符串是否为空&#xff0c;但它们的行为是不同的&#xff1a; StrUtil.isEmpty(message)&#xff1a;这个方法会检查字符串是…

数字化商品管理:革新鞋服零售模式,引领智能商业新时代

随着科技的快速发展&#xff0c;数字化浪潮席卷各行各业&#xff0c;鞋服零售企业亦不例外。在这个新时代&#xff0c;数字化商品管理不仅成为鞋服零售企业革新的关键&#xff0c;更是其引领智能商业浪潮的重要引擎。本文将围绕数字化商品管理如何深刻影响鞋服零售模式&#xf…

力扣 309. 买卖股票的最佳时机含冷冻期

题目来源&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/description/ C题解&#xff1a;动态规划 状态1&#xff1a;表示持有股票。更新为之前持有股票&#xff08;dp[i-1][0]&#xff09;或者不持有股票且不处于冷冻期后买入&…

Qt标准对话框设置

Qt标准对话框设置&#xff0c;设置字体、调色板、进度条等。 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this); }MainWindow::~MainWi…