树
Posted 风中少年呀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树相关的知识,希望对你有一定的参考价值。
树
树的各个子树互不相交。每个结点只有一个唯一的前驱结点。
路径
路径只能从上往下;从根结点到叶子结点
路径长度指这条路径所经过边的长度。
树的路径长度
树根结点到每一个结点的路径长度之和。路径长度最短的树是完全二叉树。
树的深度和高度
深度(层数):从上往下数,根结点为第一层,从根结点往下依次是第二层、第三层、、、、
高度:从下往上数,叶子结点的高度是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.![截屏2021-06-01 下午8.31.13](/Users/wangyilinmac/Library/Application Support/typora-user-images/截屏2021-06-01 下午8.31.13.png)
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个结点的完全二叉树的高度
有两种考虑方法从满二叉树或者完全二叉树来考虑。结果应该是一样的,理解这个求解的过程。
![截屏2021-06-01 下午8.28.54](/Users/wangyilinmac/Library/Application Support/typora-user-images/截屏2021-06-01 下午8.28.54.png)
二叉树的存储
顺序存储
只适用于存储完全二叉树,因为使用数组只能用下标表示和记录各个结点。完成查找子结点、父结点、结点的层次时,在完全二叉树树中有通用的公示进行快速查找。
(根结点从1开始)结点i的左孩子结点:2i。右孩子结点:2i+1 父结点:【i/2】(向下取整)。所在层次:见上面的i结点所在高度
若根结点从0开始:
链式存储
在结构体中存储左、右孩子指针。n个结点的二叉链表有n+1个空链域。总共有2n个链域,n-1个度(链)。所以空链域的个数=2n-(n+1)=n+1.
二叉树的前序、中序、后序、层序遍历算法
他们的基本思想都是递归算法,按照某种次序,使得每个结点都被访问一次且仅被访问一次。思想都是把树中的结点变成某种意义的线性序列。
前序遍历:
若该二叉树为空,则返回;否则先输出该根结点,然后前序遍历左子树,最后前序遍历右子树。
中序遍历:
若该二叉树为空,则返回;否则先依次中序遍历左子树,然后输出该根结点,最后中序遍历右子树。
后序遍历:
若该二叉树为空,则返回;否则先依次后序遍历左子树,然后后序遍历右子树,最后输出该根结点。
层序遍历:
若树为空,则返回;否则从根结点开始访问,从上到下逐层遍历,同一层中从左往右遍历。
求树的深度(采用递归算法)
若有一个叶子结点是二叉树中某个子树的中序遍历的最后一个结点,那么它一定是前序遍历的最后一个结点。
中序遍历时,n在m前的条件是:n在m左方
后序遍历时,n在m前的条件是:n是m的子孙
二叉排序树
为了解决查找和插入删除不能同时保持快速高效的问题。普通链式存储插入、删除方便,但是查找麻烦;普通顺序存储,查找方便,但是插入、删除麻烦。不是为了排序,而是为了提高查找和插入删除的速度。
二叉排序树是具有以下特点的二叉树:
1、若有左子树,那么左子树都比根结点小
2、若有右子树,那么右子树都比根结点大
3、它的左右子树也都是二叉排序树
二叉排序树的查找:
当二叉树非空,首先将待查找的值与根结点的值对比,若比根结点小,则访问左子树;若比根结点大,则访问右子树;直到查找成功返回True;若遍历完也没有匹配成功则返回false。
二叉排序树的插入:
思路与查找类似,从根结点开始,比根结点小,往左子树找,比根结点大,往右结点插。直到没有左右子树。
二叉排序树的删除:
删除操作略微复杂,需要保证删除后的树仍然是二叉排序树,若删除叶子结点,直接删除即可。
二叉平衡树(AVL树)
很好地解决了二叉排序树退化成链表的问题,把查找、插入、删除的时间复杂度降到了O(logn)
它是一棵空树或者左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一个平衡二叉树。
以上是关于树的主要内容,如果未能解决你的问题,请参考以下文章