【LeetCode经典题解】:从前序和中序遍历构建二叉树详解

【LeetCode经典题解】:从前序和中序遍历构建二叉树详解
在这里插入图片描述
🎁个人主页:User_芊芊君子
🎉欢迎大家点赞👍评论📝收藏⭐文章
🔍系列专栏:Java.数据结构
在这里插入图片描述


在这里插入图片描述

【前言】

二叉树构造是算法中递归分治思想的经典应用,而通过前序与中序遍历序列还原二叉树,更是力扣考察二叉树特性的高频题。前序“根左右”、中序“左根右”的遍历特性,是逐层确定根节点、划分左右子树的关键。本文将从递归分治思想出发,拆解该问题的实现逻辑,分析代码设计的核心细节。

文章目录:

一、从前序遍历和中序遍历构造二叉树

链接直达:从前序遍历和中序遍历构造二叉树


在这里插入图片描述

二、思路分析

根据递归分治思想:

前序遍历:根节点—>左子树—>右子树;找到前序序列的第一个元素就是根节点;中序遍历:左子树—>根节点—>右子树;找到根节点在中序序列中的位置,从而确定左子树和右子树;递归处理:重复上面的步骤,依次确定子树的根节点并构建子树,直至子树为空。

三、代码详解

1.代码分析

  • preorder:前序遍历数组;
  • inorder : 中序遍历数组;
  • 成员变量 preIndex : 用于记录前序遍历中当前根节点的索引 (通过通过全局递增依次取前序序列的根节点)
  • findVal 方法:查找根节点在中序序列中的索引rootIndex;
  • 递归方法buildTreeChild
递归终止条件:当 inbegin>inend ,说明当前子树无节点,返回null;构建根节点,取前序数组preIndex位置的元素作为根节点;划分左右子树,通过findVal方法找到根节点在中序序列中的索引rootIndex,inbegin ~ rootIndex-1为左子树,rootIndex+1 ~ inend为右子树

2.代码展示

publicint preIndex;publicTreeNodebuildTree(int[] preorder,int[] inorder){returnbuildTreeChild(preorder, inorder,0,inorder.length-1);}publicintfindVal(int[] inorder,int inbegin,int inend,int key){for(int i = inbegin;i<=inend;i++){if(inorder[i]==key){return i;}}return-1;}publicTreeNodebuildTreeChild(int[] preorder,int[] inorder,int inbegin,int inend){//递归终止条件:当前子树中序区间无节点if(inbegin>inend){returnnull;}//前序序列Index位置作为根节点TreeNode root =newTreeNode(preorder[preIndex]);//在中序序列中找到根节点的索引int rootIndex =findVal(inorder,inbegin,inend,preorder[preIndex]);//preIndex递增,指向下一个子树根节点 preIndex++;//递归左子树,范围:inbegin ~ rootIndex-1 root.left =buildTreeChild(preorder,inorder,inbegin,rootIndex-1);//递归左子树,范围:rootIndex+1 ~ inend root.right =buildTreeChild(preorder,inorder,rootIndex+1,inend);return root;}

【总结】

本文围绕前序+中序构建二叉树问题,解析了递归分治的解题思路:依托前序确定根节点,通过中序划分左右子树区间,再递归构建子树至区间为空。代码中用 prIndex 追踪前序根节点位置,借 findVal定位中序根节点索引完成边界划分,核心是对遍历特性的运用与递归终止条件的设置。此外,还可通过哈希表优化中序查找效率,该思路也为后序+中序构建二叉树等同类问题提供了参考。
在这里插入图片描述

Read more

10-Decisions Datastructures数据结构:数据查询Fetch Entity步骤全解析

Decisions Datastructures数据结构:数据查询Fetch Entity步骤全解析 前言 在前两篇内容中,我们了解了Decisions自定义数据结构的创建方法,以及数据结构与数据库的映射关系、基础增删改操作。而在实际的业务流程中,数据查询是使用频率最高的操作——从数据库中精准获取所需数据,才能支撑流程的分支判断、数据展示、业务逻辑处理等核心场景。 Decisions V9中封装了专门的查询步骤Fetch Entity,它相当于平台内置的基础SELECT查询,无需手动编写SQL,通过可视化配置就能实现数据的筛选、限制、排序。本文将从Fetch Entity的核心作用讲起,详细解析步骤的属性配置、筛选条件的设置方法。 一、Fetch Entity步骤概述 Fetch Entity是Decisions中用于获取数据记录的基础且核心步骤,适用于用户自定义数据结构和平台内部数据类型,是实现所有数据查询场景的基础,其设计贴合低代码的可视化特点,无需掌握SQL语法即可上手。 1. 核心作用 * 作为Decisions的基础「查询器」,实现对自定义数据结构/平台内

By Ne0inhk
【线性表系列终篇】链表试炼:LeetCode Hot 100 经典题目实战解析

【线性表系列终篇】链表试炼:LeetCode Hot 100 经典题目实战解析

🏠个人主页:黎雁 🎬作者简介:C/C++/JAVA后端开发学习者 ❄️个人专栏:C语言、数据结构(C语言)、EasyX、游戏、规划、程序人生 ✨ 从来绝巘须孤往,万里同尘即玉京 文章目录 * 【线性表系列终篇】链表试炼:LeetCode Hot 100 经典题目实战解析 * 文章摘要 * 一、试炼前的准备:链表解题核心技巧回顾 * 二、试炼开始:经典题目实战解析 * 题目一:反转链表 (LeetCode 206) * 解法一:迭代(双指针) * 解法二:递归 * 题目二:环形链表 (LeetCode 141) * 解法:快慢指针(Floyd判圈算法) * 题目三:合并两个有序链表 (LeetCode 21)

By Ne0inhk

LeetCode 868. 二进制间距

LeetCode 868. 二进制间距 题目描述 给定一个正整数 n,找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离。如果不存在两个相邻的 1,返回 0。 * 距离定义为两个 1 的索引差值的绝对值(索引从最低位(0)开始向右增加)。 * 示例: * 输入:n = 22 (二进制 10110),输出:2 * 解释:22 的二进制是 10110,1 的位置为 1、2、4,相邻的 1 之间的距离分别为 1 和 2,最大为 2。 解法一:遍历每一位

By Ne0inhk
数据结构|图论:从数据结构到工程实践的核心引擎

数据结构|图论:从数据结构到工程实践的核心引擎

个人主页-爱因斯晨 文章专栏-数据结构 作为数据结构中的 “复杂关系建模大师”,图论是解决路径规划、网络分析、依赖调度等问题的核心工具。不同于线性表的 “一对一” 和树的 “一对多”,图的 “多对多” 关系建模能力,使其成为互联网、嵌入式等领域的底层支撑技术。本文将从图的本质出发,用 C 语言手把手实现核心结构与算法,拆解工程落地中的关键细节。 一、图的本质:为何 C 语言实现需先选对存储方式? 图由顶点集(V) 和边集(E) 构成,记为 G=(V,E)。但在 C 语言中,没有原生的 “图” 类型,选择合适的存储结构直接决定了算法效率。实际开发中最常用的两种实现各有侧重: 1. 邻接矩阵:稠密图的 “数组方案” 邻接矩阵用二维数组graph[V][V]

By Ne0inhk