IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【搜索与图论】二叉树 -> 正文阅读

[数据结构与算法]【搜索与图论】二叉树

以下内容来源:zzu信息工程学院数据结构课件
本文主要梳理二叉树的一些概念

1 二叉树的定义和术语

在这里插入图片描述
在这里插入图片描述

2 二叉树的性质

  • 性质1:在二叉树的第i层上至多有 2i-1 个结点(i≥1)
  • 性质2:深度为k的二叉树至多有 2k-1 个结点(k≥1)
    在这里插入图片描述
  • 性质3:对任何一棵二叉树,如果其终端结点(度为0的结点)数为n0,度为2的结点数为n2,则n0=n2+1。
    在这里插入图片描述
  • 性质4:具有n个结点的完全二叉树的深度为└log2n┘+ 1(log2n向下取整再+1)
    在这里插入图片描述
  • 性质5:如果对一颗有n个结点的完全二叉树(其深度为└log2n┘+1)的结点按层序编号,对于任意结点i有:
    ①如果i = 1,则结点 i 是二叉树的根结点,无双亲;如果i > 1,则其双亲结点是└i/2┘
    ②如果2i > n,则节点 i 无左孩子;否则其左孩子就是 2i
    ③如果2i + 1 > n,则节点i无右孩子;否则其右孩子就是2i + 1
    简要概括就是:一个结点编号为i,它的左孩子(若存在)编号一定是2i,它的右孩子(若存在)编号一定是2i + 1

3 二叉树的存储结构

二叉树的存储结构包括顺序存储结构链式存储结构,先看顺序存储结构。(这个结构在算法题中使用较多)
在这里插入图片描述
注意在顺序存储结构存储时,0号单元空闲,1号单元存储根结点。
因为如果根节点是0号单元,那么2 × 0 = 0,就会使后面的子树都存在0号单元中。
然后是链式存储结构:
在这里插入图片描述
关于右下方的,可以套用已有的一个性质:n0 = n2 + 1
我们如果把所有的空链域都填上了一个叶子结点,那么原先的n个结点就都成了度为2的结点。由于叶子结点的个数 = 度为2的结点个数 + 1,所以空链域的个数就是n + 1。

链式存储结构还包括三叉链表,但也仅做了解。毕竟链式存储在算法题中本来就不怎么用到。
在这里插入图片描述

4 二叉树的遍历

4.1 二叉树遍历的定义和应用场合

在这里插入图片描述

4.2 二叉树遍历方法

根据遍历的顺序,我们有先序、中序、后序三种遍历方法。
三种遍历方法这么叫是有原因的,在课件中已经提出:

  • 先序:先根序(DLR)
  • 中序:中根序(LDR)
  • 后序:后根序(LRD)
    在这里插入图片描述
    举个例子:
    在这里插入图片描述
    结果如下:
  • 先序:ABDEFHGC
  • 中序:DBFHEGAC
  • 后序:DHFGEBCA

算法实现也很简单,就是写一个递归,以先序为例:
在这里插入图片描述

4.3 二叉树遍历的应用

如何写二叉树应用问题的递归形式的遍历算法?

  • 确定使用何种顺序的遍历
  • 写出解决问题的递归描述,确定访问当前结点时要做什么操作
  • 确定递归的出口条件

应用1 建立其二叉链表存储结构

在这里插入图片描述

应用2 利用遍历判断两棵二叉树是否相等

在这里插入图片描述

应用3 求二叉树中位于先序序列第k个结点的值

每遍历一次k - 1k为0时返回这个结点,不为0时递归遍历左右子树,即count_k()
得到返回的结点data值,即为Loc_k()
在这里插入图片描述
这个算法当时我想了好久,印象尤深……现在看来不过如此,一扫而过。
呵,不过是递归的小把戏罢了

应用4 利用遍历求二叉树的深度

递归左右子树,返回深度最大值,结果+1即可。
在这里插入图片描述

应用5 删除二叉树中所有以值为x的结点为根的子树并释放相应空间

当前树的data == x,则删除该树的所有子树delsubtree()(无条件删除)。
否则再判断左右子树DelTree()
在这里插入图片描述

应用6 用二叉树表示表达式

在这里插入图片描述
用中缀表达式计算时会出现优先级的错误,需要加括号,而用前、后缀表达式不加括号就可以避免优先级问题。所以说,在计算机内,使用前、后缀表达式可以直接进行求值运算。
比如,后缀表达式的处理方法——利用栈来模拟计算:
遇到操作数直接压栈,碰到操作符直接取栈顶的2个操作数进行计算(注意第一次取出来的是右操作数),然后再把计算结果压栈,如此循环下去。最后栈中剩下的唯一一个元素便是整个表达式的值。

应用7 用某两种序构造二叉树

已知某二叉树先序序列 { ABHFDECKG } 和中序序列 { HBDFAEKCG }, 怎样构造二叉树?
这种东西就是靠观察:
先序第一个是A,那么树的结构肯定是A做为根结点。
根据中序可知,A的左子树包含结点HBDF,右子树包含结点EKCG
HBDF中,由先序BHFD可知,B为左子树的根结点,同理,E为右子树的根结点。
由中序HBDF可知,B左子树包含结点H,右子树包含结点DF
由中序EKCG可知,E左子树没有结点,右子树包含结点KCG
其余分析同理,分析过程和结果如下:
在这里插入图片描述
当然,并不是任意给两种二叉树的遍历序列,都可以唯一确定一棵二叉树,因为先或后序的作用是确定根节点,中序的作用是确定根节点的左右子树包含哪些结点,这样一层一层递归地确定。如果只告诉先序 + 后序,确定的结果自然是不唯一的。即:

  • 先序遍历 + 中序遍历
  • 后序遍历 + 中序遍历
  • 先序遍历 + 后续遍历(不可行)
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-22 14:55:44  更:2021-09-22 14:56:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:28:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码