算法通关村第六关——如何使用中序和后序来恢复一颗二叉树

news2024/11/25 2:34:13

1 树的基础知识

1.1 树的定义

树(Tree):表现得是一种层次关系,为 n ( n ≥ 0 ) n(n≥0) nn0个节点构成的有限集合,当n=0时,称为空树,对于任一颗非空树(n>0),它具备以下性质:

  • ​ 树中有一个根(root)节点,用r表示

  • ​ 其余节点可分为m(m>0)互不相交的有限集 T 1 , T 2 , . . . , T m \bold{T_1,T_2, ...,T_m} T1,T2,...,Tm ,其中每个集合本身又是一棵树,称为原来树的子树(Subtree)。子树不相交;除了根结点外,每个结点有且仅有一个父结点;一颗N个结点的树有N-1条边。

树的一些基本术语

  1. 结点的度(Degree):结点的子树个数
  2. 树的度:树的所有结点中最大的度数
  3. 叶结点(Leaf):度为0的结点
  4. 父结点(Parent):有子树的结点是其子树的根节点的父结点
  5. 子结点(Child):若A结点是B结点的父结点,则称B结点是A结点的子结点;子结点也称孩子结点。
  6. 兄弟结点(Sibling):具有同一父结点的各结点是彼此的兄弟结点。
  7. 路径和路径长度:从结点 n 1 n_1 n1 n x n_x nx的路径为一个结点序列 n , n 2 , . . . , n x n,n_2 ,... , n_x n,n2,...,nx , n i n_i ni n i + 1 n_{i+1} ni+1 的父结点。路径所包含边的个数为路径的长度
  8. 祖先结点(Ancestor):沿树根到某一结点路径上的所有结点都是这个结点的祖先结点。
  9. 子孙结点(Descendant):某一结点的子树中的所有结点是这个结点的子孙。
  10. 结点的层次(Level):规定根结点在1层,其它任一结点的层数是其父结点的层数加1。
  11. 树的深度( Depth):树中所有结点中的最大层次是这棵树的深度。
  12. 森林:由m(m > 0)棵互不相交的树的集合称为森林。
  13. 无序树:树中任意节点的子节点之间没有顺序关系,这种树称为无序树也称为自由树。
  14. 有序树:树中任意节点之间有顺序关系,这种树称为有序树;
  15. 二叉树:每个结点最多含有两个子树的树称为二叉树

1.2 树的性质

  1. 一个二叉树第i层的最大结点数为: 2 i − 1 , i ≥ 1 2^{i-1},i≥1 2i1,i1

  2. 深度为k的二叉树有最大结点总数为: 2 k − 1 , k ≥ 1 2^k-1,k≥1 2k1,k1

  3. 对任何非空二叉树 T T T ,若 n 0 n_0 n0 表示叶结点的个数, n 2 n_2 n2 是度为2的非叶结点个数,那么两者满足关系 n 0 = n 2 + 1 n_0=n_2+1 n0=n2+1

  4. 具有n个结点的完全二叉树的深度必为 l o g 2 ( n + 1 ) log_2(n+1) log2(n+1)

  5. 对完全二叉树,若从上至下、从左至右编号,则编号为i 的结点,其左孩子编号必为2i,其右孩子编号必为2i+1;其双亲的编号必为 i 2 \frac{i}{2} 2ii=1 时为根,除外)

    对二叉树的重要操作:主要是遍历

满二叉树:如果一棵二叉树只有度为0的节点和度为2的节点,并且度为0的节点在同一层上,则这棵二叉树为满二叉树。

在这里插入图片描述

完全二叉树:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大 值,并且最下面一层的节点都集中在该层最左边的若干位置。
在这里插入图片描述

1.3 树的存储方式

  • 顺序存储结构

    • ​ 完全二叉树:按从上至下、从左到右顺序结构

在这里插入图片描述

  • 链表存储

在这里插入图片描述

1.4 树的遍历方式

  • 深度优先遍历:先往深走,遇到叶子节点再往回走。
    • 前序遍历(中左右)
    • 中序遍历(左中右)
    • 后序遍历(左右中)

在这里插入图片描述

  • 广度优先遍历(层次遍历):一层一层的去遍历,一层访问完再访问下一层。

2 通过序列构造二叉树

2.1 根据后中序列复原二叉树

给定三个序列:

(1) 前序:1 2 3 4 5 6 8 7 9 10 11 12 13 15 14

(2) 中序:3 4 8 6 7 5 2 1 10 9 11 15 13 14 12

(3) 后序:8 7 6 5 4 3 2 10 15 14 13 12 11 9 1

分析

根据后序和中序遍历来复原二叉树的思路就是先根据后序遍历确定根节点,然后中序遍历中根节点左边的是左子树,根节点右边的是右子树。根据中序遍历划分好的左右子树,在后序遍历里划分好左右子树。我们知道后序遍历最后遍历中间结点,那么就可以在后序遍历里划分好的左右子树中确定左右子树的根节点,再返回中序遍历划分左右子树。以此类推,直到复原二叉树。

第一轮:
中: 3 4 8 6 7 5 2 | 10 9 11 15 13 14 12

后: 8 7 6 5 4 3 2 | 10 15 14 13 12 11 9


第二轮:
中: 3 4 8 6 7 5 | null	    10 | 11 15 13 14 12

后: 8 7 6 5 4 3 | null		10 | 15 14 13 12 11


第三轮:
中:null | 4 8 6 7 5		null | 15 13 14 12

后:null | 8 7 6 5 4 	    null | 15 14 13 12


第四轮:
中:null | 8 6 7 5        15 13 14 | null

后:null | 8 7 6 5		15 14 13 | null


第五轮:
中: 8 6 7 | null			15 | 14

后: 8 7 6 | null


第六轮:
中: 8 | 7		

复原后的二叉树:

在这里插入图片描述

2.2 根据前中序列复原二叉树

分析

根据前序遍历和中序遍历来复原二叉树,与根据后序遍历和中序遍历复原二叉树不同之处在于前序遍历先遍历根结点,再遍历左右结点。先根据前序遍历找到根结点,再在中序遍历中划分左右子树,之后根据中序遍历划分的左右子树来对前序遍历的左右子树进行划分,之后再找左右子树的根结点。以此类推,直到复原。

过程不再赘述,与根据后序遍历和中序遍历复原二叉树大同小异。

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

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

相关文章

锁定Mac的内置键盘,防止外接键盘时的误触

场景:把你的外接键盘放在mac上,然后打字时,发现外接键盘误触mac键盘,导致使用体验极差 解决方案:下载Karabiner-Elements这款软件,并给它开启相关权限。 地址:https://github.com/pqrs-org/Ka…

并网逆变器学习笔记6---三电平SVPWM下的连续和不连续调制

之前在学习中总结过一次DPWM策略选择:并网逆变器学习笔记5---三电平DPWM 但是对于三电平逆变器而言,如何从连续调制切换到不连续调制,存在一些疑惑点,下午闲来无事,把SVPWM下的连续调制和不连续调制的开关状态选择&am…

C++实现一个链栈

C实现一个链栈 什么是链栈如何实现链栈链栈的实现开发环境代码实现运行结果 什么是链栈 链栈不名思意,就是既具有链表的特性,又具有栈的特性。 即: 链栈中的元素由指针域和数据域组成,通过指针指向下一个元素;2.链栈同…

软件测试学习:师傅领进门修行看个人

本课程学习导图 2-1 软件测试阶段 1、单元测试 概念: 对软件中的 最小可测试单元 进行检查和验证。 原则: (1)尽可能测试用例相互独立 (2)一般由代码开发人员实施 好处:(…

影响亚马逊Listing转化率的14大因素你知道吗?

我们都知道亚马逊listing转化率对于链接的推新和维稳来说有多么重要,只要转化率的比值无法达到整体市场平均比值的及格线,你就很可能会慢慢被亚马逊的飞轮算法所淘汰。 那么,具体是哪些因素在影响着你的listing转化率呢?这里我们可以分为显…

容器——1.集合概述

文章目录 1.1. Java 集合概览1.2. 说说 List,Set,Map 三者的区别?1.3. 集合框架底层数据结构总结1.3.1. List1.3.2. Set1.3.3. Map 1.4. 如何选用集合?1.5. 为什么要使用集合? 1.1. Java 集合概览 从下图可以看出,在 Java 中除了以 Map 结尾…

【深度学习】【风格迁移】Visual Concept Translator,一般图像到图像的翻译与一次性图像引导,论文

General Image-to-Image Translation with One-Shot Image Guidance 论文:https://arxiv.org/abs/2307.14352 代码:https://github.com/crystalneuro/visual-concept-translator 文章目录 Abstract1. Introduction2. 相关工作2.1 图像到图像转换2.2. Di…

Node.js |(三)Node.js API:path模块及Node.js 模块化 | 尚硅谷2023版Node.js零基础视频教程

学习视频:尚硅谷2023版Node.js零基础视频教程,nodejs新手到高手 文章目录 📚path模块📚Node.js模块化🐇介绍🐇模块暴露数据⭐️模块初体验⭐️暴露数据 🐇导入文件模块🐇导入文件夹的…

c++日志工具之——log4cpp

1、log4cpp概述 Log4cpp是一个开源的C类库,它提供了C程序中使用日志和跟踪调试的功能,它的优点如下: 提供应用程序运行上下文,方便跟踪调试; 可扩展的、多种方式记录日志,包括命令行、文件、回卷文件、内…

Kubernetes入门 一、认识Kubernetes

目录 什么是Kubernetes为什么使用 Kubernetes集群组件组件Master组件节点组件附加组件 核心概念和资源服务的分类资源和对象命名空间级ContainerPodreplicas控制器-ReplicationController控制器-ReplicaSet控制器-StatefulSet控制器-DaemonSet控制器-JobDeployment服务发现-Ser…

pytest-xdist分布式测试原理浅析

目录 pytest-xdist执行流程: pytest-xdist 模块结构: pytest-xdist分布式测试原理: pytest-xdist源码浅读: pytest-xdist执行流程: 解析命令行参数:pytest-xdist 会解析命令行参数,获取用户…

Vue3_对响应式对象解构赋值之后失去响应性——toRefs()

官网toRefs() :响应式 API:工具函数 | Vue.js toRefs 在调用时只会为源对象上可以枚举的属性创建 ref。如果要为可能还不存在的属性创建 ref,请改用 toRef。 setup(){const state reactive({name:"张三"age:14})const stateAsToRefs toRef…

SpringBoot 热部署

文章目录 前言一、spring-boot-devtools添加热部署框架支持settings 开启项目自动编译开启运行中热部署使用Debug启动 二、IDEA 自带 HowSwap 功能设置 Spring Boot 启动类等待项目启动完成点击热加载按钮存在的问题 三、JRebel 插件【推荐】安装插件使用插件 前言 在日常开发…

linux学习——Redis基础

目录 一、noSQL 类型 特点及应用场景 二、Redis 三、安装方式 编译安装 rpm安装 四、目录结构 /etc/redis.conf 五、Redis命令 六、本地登录和远程登录 本地登录 远程登录 七、数据库操作 帮助信息 库操作 数据操作 八、Redis持久化 一、RDB类型 二、AOF模式 一…

小白到运维工程师自学之路 第六十九集 (构建Docker容器监控系统:Cadvisor +Prometheus+Grafana)

一、概述 Prometheus产品简介 Prometheus是一个最初在SoundCloud上构建的开源系统监视和警报工具包。自2012年成立以来,很多公司和组织都采用了Prometheus,该项目拥有非常活跃的开发者和用户社区。 它现在是一个独立的开源项目,可以独立于任…

由于找不到msvcp140.dll无法继续执行代码多种解决方法

msvcp140.dll的作用是提供C程序运行所需的一些基本函数和类库,包括字符串处理、数学计算、文件操作、内存管理等功能。它为C程序员提供了一些常用的工具和函数,使得他们可以更方便地开发和调试程序。 当你的计算机缺少msvcp140.dll文件时,可能…

怎么把几秒的视频变成gif?视频转gif图片教程分享

无论是一段有趣的宠物视频、搞笑的表演片段,还是喜欢的电影或电视剧片段,通过gif形式分享,能够更好地吸引用户的关注、传递情感,并在社交媒体上引发互动与共鸣,那么如何才能将一段几秒钟的视频转gif图片(ht…

VoxWeekly|The Sandbox 生态周报|20230731

欢迎来到由 The Sandbox 发布的《VoxWeekly》。我们会在每周发布,对上一周 The Sandbox 生态系统所发生的事情进行总结。 如果你喜欢我们内容,欢迎与朋友和家人分享。请订阅我们的 Medium 、关注我们的 Twitter,并加入 Discord 社区&#xf…

Grafana技术文档--基本安装-docker安装并挂载数据卷-《十分钟搭建》

阿丹: Prometheus技术文档--基本安装-docker安装并挂载数据卷-《十分钟搭建》_一单成的博客-CSDN博客 在正确安装了Prometheus之后开始使用并安装Grafana作为Prometheus的仪表盘。 一、拉取镜像 搜索可拉取版本 docker search Grafana拉取镜像 docker pull gra…

活动发布报名平台型公众号开源版开发

活动发布报名平台型公众号开源版开发 后台管理、手机端自由发布活动! 为个人、企业或主办方举办各类活动提供一个发布推广与活动报名平台,主办方可以在平台进行活动发布,用户可以免费注册并灵活使用该系统的发布、报名管理、核销等功能。 功能…