免责声明:本博客图片来自互联网,如有侵权请私信。
如果想了解如何编码实现二叉树,请跳转另一篇博客:Java编码实现树
关注公众号私信我,我将自己看过的100Gjava入门到精通的视频教程分享给你,还会不定时分享一些资源和招聘信息给你
1.什么是树
按结构划分数据结构分为:一对一和一对多。
一对一的数据结构包括:线性表、栈、队列、串
一对多的数据结构包括:树
采用子树的概念递归定义树为:树是由根节点和若干子树构成的
树形结构如下图:
2.名字解释
节点:每个圆圈都为一个节点
根节点:没有父节点的节点,最顶端的节点,如上图根节点为100
父节点:如上图2的父节点位17
子节点:上图17的子节点有2 7
兄弟节点:上图 2、7为兄弟节点
子树:左子树,右子树,如上图100的左子树为19及以下的,右子树为36及以下的
节点的度:一个节点子树的个数(子节点的个数),如上图100的度为2,2的度为0
树的度:一棵树中个节点度的最大值称为树的度,如上图多叉树的度为5
叶子节点:节点度为0的节点称为叶子节点或者终端节点,如上二叉树图,2、7、3、25、1都为叶子节点
非叶子节点/分支节点:节点度不为0的节点称为分支节点或者非终端节点
内部节点:除了根节点之外的分支节点
儿子:树中节点的后继节点称为儿子或者儿子节点
双亲/夫节点:书中节点的前继节点称为父节点。
兄弟节点:同一父节点的两个节点称为兄弟节点
层数:根节点为第1层,往下依次
节点的深度:节点n的深度为根节点到节点n的最长路径长,即节点n所在的层数,如上图节点17的深度为3
树的深度:树中节点的最大层次
树的高度:等于树的深度
3.二叉树
如上图:
A为根节点,节点B和D构成一棵子树。B的两个子节点:左子节点为空树,右子节点为D。节点A、C、E是节点G的祖先。
节点D、E、F的层数是3。节点A的层数是1。从A到G经过C E两个节点三条边,形成一条长度为3的路径。节点D G H I都为
叶子节点。A B C E F为内部节点。节点I的深度为4,这棵树的高度为4。
二叉树的特点(与一般树的区别):
- 二叉树可以为空树,即不包括任何节点,一般树至少有一个节点。
- 左子树和右子树是有顺序的,二叉树是有序树
- 即使某节点只有一棵子树,也要区分左右子树
4.二叉树的性质
1.二叉树第 i 层上的节点数最多为 个。
2.高度为 k 的二叉树最多有个节点。
3.对于任何二叉树 T,设 分别表示度数为0,1,2的节点个数,则有
4.满二叉树:一棵深度为k且有个节点的二叉树称为满二叉树,如下图
5.完全二叉树:若一个二叉树最多只有最下面两层节点的度数可以小于2,并且最下一层上的节点都集中在该层的最左边的若干位置上,则为完全二叉树。满二叉树是完全二叉树,完全二叉树不一定是满二叉树。
如下图
在完全二叉树中,如果某个节点没有左子节点,那么该节点也一定没有右子节点。如下图就不是一个完全二叉树
6.满二叉树原理,非空满二叉树的叶子节点数等于其分支节点数+1.
7.一棵非空二叉树空子树的个数等于其节点数目+1.
5.在JAVA中,二叉树节点的对应接口:BinNode
6.二叉树的存储结构
二叉树的顺序存储的原则:不管给定的二叉树是不是完全二叉树,都看作完全二叉树,即按照完全二叉树的层次次序(从上到下,从左到右)把个节点按次序依次存到数组中,如下图
缺点:会造成一定的存储空间浪费。
因此一般二叉树的存储结构更多的采用链式的方式
7.二叉树遍历
1.前序遍历:先遍历根节点,再遍历左子树,最后遍历右子树
java代码实现请查看另一篇博客:二叉树代码实现
2.中序遍历:先遍历左子树,再遍历根节点,最后遍历右子树
java代码实现请查看另一篇博客:二叉树代码实现
3.后序遍历:先遍历左子树,再遍历右子树,最后遍历根节点
4.层次遍历:指二叉树从第一层(根节点)开始,从上往下 逐层进行遍历,在同一层中,从左到右的顺序对节点进行逐个访问
8.树和二叉树的转换
1.树转换成二叉树
对于一棵无序树,他的各节点的次序是无关紧要的。而对于二叉树中节点的左右儿子节点来说是有去别的。为了避免混淆,常约定将树中每个节点的儿子节点按从左到右的次序进行编号,也就是说把树看作有序树。如下图所示,根节点A右三个儿子节点B C D,可以认为节点B为A的第一个儿子节点,节点C为A的第二个儿子节点,节点D为A的第三个儿子节点。
将一棵树转换为二叉树的方法是:
1.树中的相邻节点(兄弟节点)之间连一条线。
2.对树中的每个节点,只保留它与第一个儿子节点的连线,其他的都去掉。
3.以树的根节点为轴心,将整棵树顺时针转动一定的角度,使之结构发生变化。如下图所示。
由于树的根节点不可能右兄弟节点,所以转换后的二叉树根节点的右子节点始终为空。
2.二叉树还原成普通树
具体方法如下:
1.若某节点是其双亲节点的左儿子,则把该节点的右儿子、右儿子的右儿子。。。。。。都与根节点连接起来。
2.删掉原二叉树双亲节点与右儿子节点的连线。
3.将所得的树进行简单的调整,使结构分明。如下图所示
9.哈夫曼树
1.名词解释
1.路径及路径的长度:在一棵树中,从一个节点往下可以达到的孩子或子孙节点之间的通路,称为路径。通路中分支的数目称为路径长度
若规定根节点的层数为第1层,则从跟节点到 第L层节点的路径长度为 L-1。
2.节点的权及带权路径:若将树中节点赋给一个有着某种意义的数值,则这个数值就称为该 节点的权。
节点的带权路径长度为:从根节点到该节点的路径长度和该节点的权的乘积。
3.树的带权路径长度:树的带权路径长度为所有节点带权路径长度的和
4.最优二叉树:给定n个权值作为n个叶子节点,按照一定的规则构造一棵二叉树,使带权路径长度达到最小,称这样的二叉树为最优二叉树,也叫哈夫曼树。