数据结构与算法-(二叉树)

二叉树的深度平均值:O(log N )

前序遍历:顺序:访问根结点——》访问左子树——》访问右子树

后序遍历:顺序:访问根结点——》访问右子树——》访问左子树

后序遍历:顺序:访问根结点——》访问右子树——》访问左子树


二叉树

二叉树是树的一种。

 

二叉树的特征是,除了叶以外的结点,都有两个子。(叶就是在它和根的路径上,没有比他更远的结点了,也可以理解为,只有一个结点和它相连,并且它不是根,那么他就是叶)

 

简单来说,就是在有根树的基础上,一个结点,往更深的地方延伸时,最多只能延伸出来零个,或者两个结点(只能是0个或者2个,不能是1个。如果是0个就是叶,否则就是结点),那么他就是二叉树。

 

例如:图中延伸出0个结点(叶)有:E,G,H,I,J,K

而延伸出2个结点的有:A,B,C,D,F

 

 

 

 

 

4.树的遍历

所谓树的遍历,是指对树中所有结点的信息的访问。

其重点有2个:

①对所有结点进行访问(假如有结点没有被访问,肯定算不上遍历了)

②对每个结点只访问一次;

 

说起遍历,那么前提是树必须有顺序。

    假如A结点是根结点,B和C是他的子(二叉树)。那么如何遍历呢?

    先访问A再访问B最后C?还是A->C->B?又或者是先访问B或者C?

    这些都是不一样的。

只有有了顺序,才能决定怎么访问。同样以A、B、C三个结点为例,A是根结点,B左C右,或者是B右C左,其并非是同一个树。

    根据我个人所知推断,假如有这样一个树,他最终是要存储到硬盘里的,如果B在A左边,C在A右边,其必然是有一定原因和规律的。例如,三个数都是int值,B=10,A=20,C=30。那么以数组形式存储,其为{B,A,C}。比A小的放A左边,比A大的放A右边,数组以增序排列。假如值不变,形式为{C,A,B},那么数组就变为以减序排列了。增序和减序,显然是不一样的。

因此,树的左右顺序是不能颠倒的。

疑问:我找的资料上说的是二叉树其左右是不能颠倒的,那么三叉树,或者其他树可以颠倒么?我推测应该也是不能的吧,至于为什么,需要查查资料。

 

二叉树的遍历方法主要有三种:

①前序遍历;(先访问根结点,再访问子结点)

②后序遍历;(先访问子结点,再访问根结点)

③中序遍历(只适用于二叉树)

 

前序遍历:

顺序:访问根结点——》访问左子树——》访问右子树

在访问子树,依然按该顺序进行访问。

 

以上图中的二叉树为例,前序遍历的顺序是

其逻辑是:

(1)先访问根;

(2)当前如果是根,且无子结点,则结束;如果是根,有子结点,第二次返回根的时候结束;(在编程时如何做到这一点?

(3)查看有没有没有访问过的子结点(问题,如何判断是不是访问过的):

(3.1)如果有,则访问子结点的左边部分,重复(2);

(3.2)如果没有,则判断当前结点是不是子结点的左结点:

(3.2.1)如果是,则访问右结点,重复(2);

(3.2.2)如果不是,返回父结点,重复(2)

 

 

后序遍历:

顺序:访问根结点——》访问右子树——》访问左子树

顺序正好和前序遍历相反。

所以,具体的就省略了。

 

 

中序遍历:

所谓的中序遍历,就是指,先访问左子树,再访问根,再访问右子树。

 

具体到每一个子树时,也是如此。

 

与前序遍历和后序遍历不同的是,中序遍历在访问子树的过程中,并不直接访问路径上的,而是先要确定该子树还有没有子结点,如果没有了,才访问它,如果有,则继续访问子树的子树。

 

例如:


以图为例,由于B是A的子,D是B的子,H是D的子,而H没有子了。因此,先访问H。

然后访问H的父(D),访问D。

然后D的右子是I,因此访问I。

I没有子了,返回D;D的子树访问完了,因此返回D的父(B),访问B;

B的右子,因此访问E;

E没有子了,因此返回B,而B的子树也访问完了,因此返回A,访问A;

A的右子树是C,而C有子(F),F有子(J),J无子,因此访问J;

返回J的父F,访问F;

F的右子是K,访问K;

K无子,返回F,F的子树访问完了,返回C,C的右子是G,G无子,访问G。

树的遍历结束。其顺序是:H-D-I-B-E-A-J-F-K-C-G。

 

形象的说,就是先访问左子树,假如左子树没有子,则访问结点,并返回,访问父,再访问父的右子树。然后重复即可。——左-父-右的顺序

 

 

树的结点

包括一个数据元素,和从这个元素,指向其各个子树的分支(但不包括指向其父树的分支)。

结点拥有的子树数,称为结点的度Degree),度为0的结点,称为叶结点Leaf)或终端节点;

度不为0的结点,称为非终端结点分支结点

除根结点外,分支结点也称为内部结点。

树的度为树内各节点的度的最大值

 

简单来说,树的每个结点都有度,看他往下连向几个结点(只考虑下一层,不考虑更深部分),其度就是几,没有就是0

没有继续往下连接的(叶),就是叶结点;

不是根也不是叶的,就是内部结点;

每个结点都有度,所有结点中,度最大的结点的度,就是树的度。

 

 

树的顺序:

之前说过,二叉树的结点的左右子树是不能交换的,也就是说,有顺序的。

假如一个树,其结点的子树之间的左右顺序,是有次序的,不能互相交换,那么就说这个树是有序树,否则就是无序树

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值