树
一、什么是树?
(一)概念:客观世界中许多事物存在层次关系,这个层次关系就是树。
(二)作用:提供分层次组织的思路,提高管理效率。
>应用:数据管理的基本操作之一——查找
1.概念:根据某个给定关键字K,从集合R中找出关键字与K相同的记录。
2.静态查找:
查找√ 插入❌删除❌
(1)顺序查找(法1)
a.要利用数组
b.用一个有两个分量的结构指针指向数组,表示 数组的头 和 数组容量

c.技巧——哨兵:先将数组中下标为0的元素赋为K——>不需要判断下标为是否到达边界。
(无哨兵)
(有哨兵)
d.返回的结果如果等于零,说明没找到K;不等于零,说明找到K,且知道了所在元素下标。
e.时间复杂度为O(n),效率不高。
(2)二分查找(法2)
a.伪代码
b.时间复杂度为O(logN)
c.二分查找必须首先进行数据有序且连续化的处理,查找过程中会形成一种树形结构——判定树。树中结点表示当前判定的元素,所在层数表示该元素会在第几次被查到。
d.平均成功查找次数ASL = (Σ结点的层次*当前层结点个数) / 结点总个数

e.若不把数据放在数组里,而是直接以树这样层次化的结构存储数据,是否也能达到二分查找的效果?——>以树的一种形式存储我们需要的数据,是的我们的查找过程更加方便——>查找树(时间复杂度也为O(logN))[在树里插入和删除节点比在数组里方便得多]——>动态查找问题
3.动态查找:
查找√ 插入√ 删除√
二、树的定义
空树(n=0)、非空树(n>0)、根、子树、树(子树不相交,每个结点有且仅有一个父结点,有N个结点的树有N-1条边)与非树、结点的度(子树的个数)、树的度(所有结点中最大的度数)、叶节点(度为0的结点)、树的深度(所有结点中的最大层次)......
三、树的表示
对于
1.用数组+链表的结构存数据。每个结点有指向子结点的指针,指针个数为树的度
造成了2n+1个空间的浪费
2.儿子兄弟表示法。每个结点的结构统一,都有两个指针,一个指向第一个儿子,另一个指向儿子的下一个兄弟。


——倾斜45°——>

——>每一个结点都有两个指针,一个指向左边一个指向右边,每个结点最多有两个儿子
——>二叉树(度为2的树)
四、二叉树
(一)定义:一个有穷的结点的集合(可以为空)
(二)五种基本形态

(a.空树 b.只有一个结点 c.只有一个左子树,右子树为空 d.只有一个右子树,左子树为空 e.左右两边都不空,有两个子树)
(三)!!二叉树的子树有左右之分
(四)特殊二叉树
斜二叉树、完美二叉树(满二叉树)(除叶结点外,每个结点都有两个儿子,而且叶结点都在同一层)、完全二叉树(每个结点同样必须有两个儿子,也就是,存在的每个结点都是满的,都有两个儿子)。
(完美二叉树是完全二叉树,完全二叉树不一定是完美二叉树)

(五)重要性质

3.n0=n2+1
证明:树中边的个数为结点数减一:
树中边数=n0+n1+n2-1 ①
度为0的结点给树中边的个数贡献为0,度为1的结点贡献值为1,度为2的贡献2:
树中边数=0*n0+1*n1+2*n2 ②
由①=②得n0=n2+1
(六)二叉树相关操作

(七)二叉树常用的遍历方法

1.先序:根左右

对于
,遍历的顺序为:A (B D F E) (C G H I)
2.中序:左根右

对于
,遍历的顺序为:(D B E F) A (G H C I)
3.后序:左右根

对于
,遍历的顺序为:(D E F B) (H G I C) A
>可以发现
每种遍历顺序都沿着同一条路径,每个节点我们会路过三次,不同之处在于"print"结点的时机(访问各结点的时机)不同

先序:第一次路过时就访问; 中序:第二次路过时访问; 后序:第三次路过时访问
注意,叶结点的三次是连着的。
>上面的三种遍历方法主要是递归遍历,根本上的实现方法还是用堆栈,所以,有没有一种可能直接用堆栈实现三种顺序的遍历。——>二叉树的非递归遍历
(八)二叉树的非递归遍历
1.利用堆栈遍历
(1)中序遍历的非递归遍历算法

(2)先序遍历的非递归遍历算法

2.利用队列遍历
——层序遍历
(1)前情提要:
二叉树遍历的核心问题:二维结构的线性化。对同样一个二维结构,用不同的遍历方法会产生不同的序列。
那么二维变一维的难点在哪?——>在遍历二叉树这个二维结构时,访问左右儿子的前提是访问到它们的父亲。那么对于一个结点,在访问它的一个儿子时,另一个怎么办,或者它自己怎么办,我们不能把它扔掉,要想办法把自己(这样至少能通过自己找到另一个儿子)和儿子保存起来——>怎么保存呢?——>需要一个存储结构保存我们暂时不访问的结点——>堆栈or队列(二者均可实现算法的非递归遍历)
(2)层序遍历:根节点入队——>结点出队,访问该结点,该结点左右儿子入队(循环)
对于
操作过程:








各结点被访问的顺序为:

程序:

3.二叉树遍历的应用
(1)输出二叉树中的叶子结点
(先序遍历+ if语句)

(2)求二叉树的高度
(后序遍历)

(3)二元运算表达式树及其遍历

!!若d,e的根结点为+,f的根结点为*,中缀表达式变为:a+b*c+d+e*f*g,改变了原来的值。

所以,中缀表达式会受到运算优先级的影响。
(4)由两种遍历序列确定二叉树
· 两种遍历中,只要有中序遍历就能唯一确定一个树。
以 先序+中序为例:


(九)二叉树的建立

1.二叉搜索树的查找操作


2.二叉搜索树的插入操作

3.二叉搜索树的删除操作

PS:
>本文章用于个人学习记录
>更新日志:2023.5.3.更新:重要性质三的证明,三种常用遍历方法
2023.5.4.更新:用队列实现层序遍历
2023.7.28更新:平衡二叉树
文章介绍了树的概念和作用,强调了其在数据管理中的查找操作,包括顺序查找和二分查找。接着详细讨论了二叉树的定义、形态、性质以及遍历方法,如先序、中序和后序遍历,并提到了非递归遍历和层序遍历。此外,文章还涉及二叉搜索树的操作,如查找、插入和删除。

882






