数据结构---来自外太空讲解的树的基本概念

免责声明:本博客图片来自互联网,如有侵权请私信。

如果想了解如何编码实现二叉树,请跳转另一篇博客: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个叶子节点,按照一定的规则构造一棵二叉树,使带权路径长度达到最小,称这样的二叉树为最优二叉树,也叫哈夫曼树

2.哈夫曼树的构造

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值