当前位置: 首页 > ops >正文

二叉树构造:从前序、中序与后序遍历序列入手

目录

引言

从前序与中序遍历序列构造二叉树(题目 105)

解题思路

举例说明

从中序与后序遍历序列构造二叉树(题目 106)

解题思路

举例说明

总结


引言

二叉树的遍历与构造是算法领域中的经典问题。LeetCode 上的“从前序与中序遍历序列构造二叉树”(题目 105)和“从中序与后序遍历序列构造二叉树”(题目 106),能帮助我们深入理解二叉树的特性。通过剖析这两道题,我们可以掌握利用不同遍历序列构建二叉树结构的方法。

从前序与中序遍历序列构造二叉树(题目 105)

解题思路

先序遍历的顺序是“根 - 左 - 右”,这意味着先序遍历的第一个元素必定是二叉树的根节点。而中序遍历的顺序是“左 - 根 - 右” 。我们可以这样构建二叉树:

1. 首先,从先序遍历序列中取出第一个元素,它就是当前子树的根节点。

2. 然后,在中序遍历序列中找到这个根节点。以这个根节点为界,它左边的元素构成了左子树的中序遍历序列,右边的元素构成了右子树的中序遍历序列。

3. 接着,根据中序遍历中左子树元素的个数,我们可以在先序遍历序列中确定左子树的先序遍历序列(从先序遍历的第二个元素开始,长度为左子树元素个数),剩下的部分就是右子树的先序遍历序列。

4. 最后,通过递归的方式,分别对左子树和右子树的遍历序列重复上述步骤,不断构建出完整的二叉树。

举例说明

假设先序遍历序列为  [3, 9, 20, 15, 7]  ,中序遍历序列为  [9, 3, 15, 20, 7]  。先序遍历的第一个元素  3  是根节点。在中序遍历中找到  3  ,其左边的  [9]  是左子树中序遍历序列,右边的  [15, 20, 7]  是右子树中序遍历序列。左子树元素个数为  1  ,那么先序遍历中从第二个元素开始长度为  1  的  [9]  就是左子树先序遍历序列,剩下的  [20, 15, 7]  是右子树先序遍历序列。然后对左右子树的遍历序列递归操作,逐步构建二叉树。

从中序与后序遍历序列构造二叉树(题目 106)

解题思路

后序遍历的顺序是“左 - 右 - 根”,所以后序遍历的最后一个元素就是二叉树的根节点。结合中序遍历“左 - 根 - 右”的顺序,构建过程如下:

1. 取出后序遍历序列的最后一个元素,它是当前子树的根节点。

2. 在中序遍历序列里找到这个根节点。根节点左边的元素是左子树的中序遍历序列,右边的是右子树的中序遍历序列。

3. 根据中序遍历中左子树元素的数量,我们可以在后序遍历序列中确定左子树的后序遍历序列(从后序遍历序列起始位置开始,长度为左子树元素个数),右子树的后序遍历序列就是剩下的部分(不包含已经确定为根节点的那个元素) 。

4. 同样通过递归,对左子树和右子树的遍历序列进行上述操作,直至构造出整棵二叉树。

举例说明

若中序遍历序列是  [9, 3, 15, 20, 7]  ,后序遍历序列是  [9, 15, 7, 20, 3]  。后序遍历的最后一个元素  3  是根节点。在中序遍历中找到  3  ,其左边  [9]  为左子树中序遍历序列,右边  [15, 20, 7]  为右子树中序遍历序列。左子树元素个数为  1  ,后序遍历中从起始位置开始长度为  1  的  [9]  是左子树后序遍历序列,剩下的  [15, 7, 20]  是右子树后序遍历序列。后续对左右子树递归构建。

总结

这两道题都是利用不同遍历序列的特性,通过确定根节点,划分左右子树遍历序列,再递归构建的方式来解决。理解了这些思路,不仅能轻松应对二叉树构造相关题目,还能加深对二叉树遍历本质的认识,为解决更复杂的树结构问题打下基础。

http://www.xdnf.cn/news/7003.html

相关文章:

  • USB学习【11】STM32 USB初始化过程详解
  • 【AI】Ubuntu 22.04 4060Ti16G 基于SWIFT框架的LoRA微调 模型Qwen3-1.8B 数据集弱智吧 微调笔记
  • 【iOS】探索消息流程
  • 上位机知识篇---流式Web服务器模式的实现
  • STM32SPI通信基础及CubeMX配置
  • OVS练习笔记20250518
  • Kubernetes控制平面组件:Kubelet详解(五):切换docker运行时为containerd
  • Vue-监听属性
  • 报错System.BadImageFormatException:“试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)”
  • 面试中的线程题
  • 数据结构:二叉树一文详解
  • Linux安全第三章-系统安全及应用
  • 深入浅出Hadoop:大数据时代的“瑞士军刀”
  • 面向GIS的Android studio移动开发(二)--在地图上绘制电子围栏
  • Linux(2)——shell原理及Linux中的权限
  • 黑灰产业链深度解析
  • 最新缺陷检测模型:EPSC-YOLO(YOLOV9改进)
  • 使用 C# 入门深度学习:线性代数详细讲解
  • Android 性能优化入门(一)—— 数据结构优化
  • MLLM常见概念通俗解析(三)
  • Java面试深度解析:微服务与云原生技术应用场景详解
  • 互联网大厂Java面试:从Spring到微服务的深度探讨
  • 一种开源的高斯泼溅实现库——gsplat: An Open-Source Library for Gaussian Splatting
  • svn: E170013 和 svn: E120171 的问题
  • 二分算法的介绍简单易懂
  • 想要建站但没有服务器?雨云RCA,免服务器即可搭建完整网站!!!
  • 用golang实现二叉搜索树(BST)
  • (三)MMA(KeyCloak身份服务器/OutBox Pattern)
  • Serverless技术深度整合:从冷启动优化到边缘场景落地
  • 【Mini 型 http 服务器】—— int get_line(int sock, char *buf, int size);