数据结构-二叉树
作者:互联网
持续学习&持续更新中…
数据结构-二叉树
树形结构简介
以文件夹的分类为例,如果我们将各种不同类型的文件按照其类型分别放在不同的文件夹中,可以大大提高我们寻找文件的速度。
树形结构无论是考试还是面试都很重要。
以后的课程都离不开树形结构。
树的基本概念01
节点
- 节点:图示中的每一个圆圈(元素)都是节点。
- 根节点:图示中的圆圈1就是根节点,一棵树最多只有一个根节点。
- 父节点:圆圈1就是圆圈2、3、4、5、6的父节点;圆圈2就是圆圈21和圆圈22的父节点。
- 子节点:圆圈2、3、4、5、6就是圆圈1的子节点;圆圈21和圆圈22就是圆圈2的子节点。
- 兄弟节点:同一个节点下的所有圆圈(元素)都是兄弟节点,例如圆圈2、3、4、5、6都是兄弟节点。也就是说,兄弟节点拥有相同的父节点。
子树
子树:
左右子树:
上图中,红笔圈出来的部分就分别是圆圈2的左右子树。
树的基本概念02
层数
节点的深度
圆圈31的深度是3;
圆圈2的深度是2;
节点的高度
有序树、无序树、森林
二叉树的基本概念
二叉树是有序树
二叉树的特点:二叉树是(严格)有顺序的;二叉树是(严格)区分左右子树的。
二叉树的几种形态
二叉树的性质
二叉树的边数
令二叉树的边数为T,节点总数为n,度为0(叶子结点)的节点个数为n0,度为1的节点个数为n1,度为2的节点个数为n2。
边数的计算方式一:
节点的边数和节点的度数相同:
- 如果某个节点的度为2那么这个节点就有两条边
- 如果某个节点的度为1那么这个节点就有一条边
- 如果某个节点的度为0(叶子结点)那么这个节点就没有边
得到:T = n1 + 2 * n2
边数的计算方式二:
如果反过来思考一下节点的边数,会有新的发现:除了根节点以外的每一个节点,其头顶都会有一条边。
得到:T = n - 1 = n0 + n1 + n2 - 1
真二叉树
满二叉树
完全二叉树
节点从上往下、从左到右排布的二叉树就是完全二叉树。如果排满了,就是满二叉树。
如果对完全二叉树从上往下、从左到右,按照顺序开始编号的话,这个完全二叉树的编号都会和它对应的满二叉树的编号完全一致。
完全二叉树的性质01
总结点数量n和完全二叉树高度h关系的推导
h - 1 <= log2n < h
首先,h肯定是一个整数(树的高度)。n是总结点数量。
log2n求出来不一定是一个整数,有可能是一个浮点数。
当log2n求出来是浮点数的时候
假设当log2n求出来是4.8:
要满足h - 1 <= log2n < h
,那么此时,h求出来一定是5;
假设当log2n求出来是7.4的时候,此时h求出来一定是8。
由此可以推出:h = log2n向上取整
或者h = log2n向下取整 + 1
向下取整就是指省略小数部分的意思。(只取整数部分)
向上取整就是指取大于该小数的最小整数。(整数部分 + 1)
当log2n求出来是整数的时候
假设当log2n求出来是5:
要满足h - 1 <= log2n < h
,那么此时,h求出来一定是6;
假设当log2n求出来是7的时候,此时h求出来一定是8。
由此可以推出:h = log2n + 1
n和h的关系推导总结
上述推导出了三个公式:
h = log2n向上取整
(log2n为浮点数)h = log2n向下取整 + 1
(log2n为浮点数)h = log2n + 1
(log2n为整数)
很明显,我们应该使用公式2和公式3,因为它们都有共同的+1操作。
又由于(在Java、C中)整数向下取整还是该整数,所以我们可以最终使用公式2作为n与h的关系公式。
完全二叉树的性质02
对节点从1开始编号
对节点从0开始编号(常用)
面试题:求完全二叉树叶子结点的个数
推导n0的总结公式
非叶子结点的推导过程和n0的推导过程类似,这里只推导一下n0总结的公式。
向上取整和向下取整一般来说是可以互相切换的,但是编程中默认就是向下取整,因此一般都使用向下取整。
国外二叉树的叫法
参考
小码哥李明杰老师课程: 恋上数据结构与算法 第一季.
小码哥李明杰老师博客: M了个J.
本文完,感谢您的关注支持!
标签:推导,log2n,取整,二叉树,圆圈,数据结构,节点 来源: https://blog.csdn.net/weixin_44018671/article/details/120112742