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开始:

IMG_6512

链式存储

在结构体中存储左、右孩子指针。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,并且左右两个子树都是一个平衡二叉树。

以上是关于树的主要内容,如果未能解决你的问题,请参考以下文章

从B树B+树B*树谈到R 树

Trie树(字典树)

从B树B+树B*树谈到R 树

转B树B-树B+树B*树红黑树 二叉排序树trie树Double Array 字典查找树简介

B树B-树B+树B*树

#树# #线段树#