树
树
树的各个子树互不相交。每个结点只有一个唯一的前驱结点。
路径
路径只能从上往下;从根结点到叶子结点
路径长度指这条路径所经过边的长度。
树的路径长度
树根结点到每一个结点的路径长度之和。路径长度最短的树是完全二叉树。
树的深度和高度
深度(层数):从上往下数,根结点为第一层,从根结点往下依次是第二层、第三层、、、、
高度:从下往上数,叶子结点的高度是1,从叶结点往上高度依次是2、3、4、、、
度
结点的度:该结点有几个分支结点,那么度为几。
树的度:树中结点的度的最大值。
有序树与无序树
无序树:树的左右子树可以互换,没有顺序 比如:国家的行政区划
有序树:树的左右子树可不以互换,有顺序 比如:家谱
树的常考性质
结点数=总度数+1。总度数就是树中边的数量。
总度数=各个结点的度数之和
m叉树与度为m的树的区别
1、m叉树是所有结点的度数小于等于m,最大度数可以小于m,甚至可以是空树;而度为m的树至少有一个结点的度是m而且最大的度是m,显然度为m的树不可能为空树
2、度为m的树至少有m+1个结点
一些数量关系
1、度为m的树第i层至多有\(m^{i-1}\)个结点
2、高度(深度)为h的m叉树最多有\(\frac{m^{h}-1}{m-1}\)个结点
3、高度为h的m叉树至少有h个结点
4、高度为h、度为m的树至少有h+m-1个结点
5、具有n个结点的m叉树的的最小高度是:\(\log _{m}(n(m-1)+1)\)
二叉树
是度小于等于2的树,(可以为一个空树)即每个结点最多只有两个子结点,且两个子结点有序
二叉树的性质:
1、子树有左右之分,不能颠倒
2、第i层上最多有\(2^{i-1}\)个结点
3、高度为k的二叉树,最多有\(2^k-1\)个结点
4、若叶结点有m个,度为2的结点有n个,则m=n+1。这个性质是怎么来的呢?把所有结点按度数分成三类。n0,n1,n2.
5、完全二叉树中可以由结点数的推出度为0,1,2的结点数
因为n0=n2+1,n=n0+n1+n2,所以n1的奇偶性和n的奇偶性相反。又n1要么是0要么是1。所以可以推出n1,然后推出n0,n2。
满二叉树
如果所有的分支结点既有左子树又有右子树,且所有叶子结点都处在同一层。就称为满二叉树。叶结点个数=非叶结点个数+1
高度为k的满二叉树的结点个数为\(2^{k-1}\)个
根结点从1开始编号,i结点的左孩子的编号为2i,右孩子编号为2i+1;结点i的父结点编号为【1/2】(向下取整)
完全二叉树
将满二叉树从右往左删除几个结点得到完全二叉树。即除了叶结点那一层,其他层全满,而最下层结点从左往右填满。
构造方法就是从上到下,从左往右放置结点。
叶结点在最后两层,度为1的结点最多只能有一个(也可以是0个)。
若n为结点个数,则编号i<[n/2](向下取整)的结点是分支结点;编号i>[n/2](向下取整)的结点是叶结点。
n个结点的完全二叉树的高度
有两种考虑方法从满二叉树或者完全二叉树来考虑。结果应该是一样的,理解这个求解的过程。

二叉树的存储
顺序存储
只适用于存储完全二叉树,因为使用数组只能用下标表示和记录各个结点。完成查找子结点、父结点、结点的层次时,在完全二叉树树中有通用的公示进行快速查找。
(根结点从1开始)结点i的左孩子结点:2i。右孩子结点:2i+1 父结点:【i/2】(向下取整)。所在层次:见上面的i结点所在高度
若根结点从0开始:
链式存储
在结构体中存储左、右孩子指针。n个结点的二叉链表有n+1个空链域。总共有2n个链域,n-1个度(链)。所以空链域的个数=2n-(n+1)=n+1.
二叉树的前序、中序、后序、层序遍历算法
他们的基本思想都是递归算法,按照某种次序,使得每个结点都被访问一次且仅被访问一次。思想都是把树中的结点变成某种意义的线性序列。
前序遍历:
若该二叉树为空,则返回;否则先输出该根结点,然后前序遍历左子树,最后前序遍历右子树。
中序遍历:
若该二叉树为空,则返回;否则先依次中序遍历左子树,然后输出该根结点,最后中序遍历右子树。
后序遍历:
若该二叉树为空,则返回;否则先依次后序遍历左子树,然后后序遍历右子树,最后输出该根结点。
层序遍历:
层序遍历的算法实现(利用队列)
1、构造初始化一个辅助队列
2、根结点入队
3、若队列非空,则队头结点出队;访问该结点,并将他的左、右孩子结点入队(如果有的话)
4、重复3直至队空
若树为空,则返回;否则从根结点开始访问,从上到下逐层遍历,同一层中从左往右遍历。
求树的深度(采用递归算法)

若有一个叶子结点是二叉树中某个子树的中序遍历的最后一个结点,那么它一定是前序遍历的最后一个结点。
中序遍历时,n在m前的条件是:n在m左方
后序遍历时,n在m前的条件是:n是m的子孙
由遍历序列构造二叉树 一定都要加上中序遍历才能得出唯一的二叉树
1、前序+中序
2、后序+中序
3、层次+中序
前序:出现在最前面的是根结点
中序:根结点左边的是左子树,右边的是右子树
后序:出现在最后面的是根结点
层次:最前面的是根结点,按照层次从上到下,从左往右
不同遍历方法中叶子结点的排列顺序是一样的
二叉线索树 是一种物理结构
为了解决从某一结点(不知道根结点,不知道整个遍历输出序列)开始找不到(某种遍历方法下)它的前驱结点和后继结点的问题
n个结点有n+1个空链域,将这n+1个空链域用来指向他们的前驱和后继结点。并在结构中加入指针标签来区分该指针是指向真实左右子结点还是指向线索的。
线索化定义:
若结点左指针为空,则将其指向上一个遍历结点地址;若右指针为空,则将其指向下一个遍历结点地址。
二叉树任意线索化后最多只有两个空链域
因为对于一个遍历后序列而言,中间的结点都有前驱结点和后继结点,所以他们的链域都会被填满。而只有首结点没有前驱结点、尾结点没有后继结点。可能为空。
即:若首结点没有左子树,则该链域为空;若尾结点没有右子树,则该链域为空。
并不是每个结点通过线索都可以直接找到他的前驱和后继
比如先序线索二叉树中求先序前驱结点
后序线索二叉树中求后继结点
后序线索树的遍历需要栈的支持
先序序列为a,b,c,d的不同二叉树的个数是:14
考点1:先序遍历和中序遍历可以完全确定一棵二叉树
考点2:相当于以先序序列为入栈序列,以中序序列为出栈序列
考点3:n个不同元素入栈,则出栈序列有
个
一是对于这棵树,按先序遍历进栈再退栈得到的是中序序列,二是这棵树的中序序列可以由按先序遍历进栈的情况下的一种退栈顺序得到
先序遍历的过程中就会用到这个栈,入栈顺序就是先序序列;而出栈顺序就是中序序列。
在根结点在栈中之后入栈的是根结点的左子树,在根结点出栈之后入栈的根结点的右子树
二叉排序树
为了解决查找和插入删除不能同时保持快速高效的问题。普通链式存储插入、删除方便,但是查找麻烦;普通顺序存储,查找方便,但是插入、删除麻烦。不是为了排序,而是为了提高查找和插入删除的速度。
二叉排序树是具有以下特点的二叉树:
1、若有左子树,那么左子树都比根结点小
2、若有右子树,那么右子树都比根结点大
3、它的左右子树也都是二叉排序树
二叉排序树的查找:
当二叉树非空,首先将待查找的值与根结点的值对比,若比根结点小,则访问左子树;若比根结点大,则访问右子树;直到查找成功返回True;若遍历完也没有匹配成功则返回false。
二叉排序树的插入:
思路与查找类似,从根结点开始,比根结点小,往左子树找,比根结点大,往右结点插。直到没有左右子树。
二叉排序树的删除:
删除操作略微复杂,需要保证删除后的树仍然是二叉排序树,若删除叶子结点,直接删除即可。
二叉平衡树(AVL树)
很好地解决了二叉排序树退化成链表的问题,把查找、插入、删除的时间复杂度降到了O(logn)
它是一棵空树或者左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一个平衡二叉树。
带权路径长度之和
树的带权路径长度之和=叶结点的深度与权值的积的总和

浙公网安备 33010602011771号