聊聊树与二叉树

1.什么是树

 

    现实生活中的树就是有一个主干,加分支加叶子组成的一种植物,大概如下图所示

 

 

    数据结构中的树是什么样子呢?他就像是一个倒着生长的树,对照着两幅图看,是不是很相似。其中圆圈的位置就是数据存放的地方。

 

 

    每个元素我们叫作“节点”,也就是图中的每个圈;用来连线相邻节点之间的关系,我们叫作“父子关系,A 节点就是 B 节点的父节点,B 节点是 A 节点的子节点。B、C、D 这三个节点的父节点是同一个节点,所以它们之间互称为兄弟节点。我们把没有父节点的节点叫作根节点,也就是图中的节点 E。我们把没有子节点的节点叫作叶子节点或者叶节点,比如图中的 G、H、I、J、K、L 都是叶子节点。

 

 

 

 

    还有三个比较相似的概念:高度(Height)、深度(Depth)、层(Level)。它们的定义是这样的

 

 

 

    实际上节点的高度就是该节点到最下面,也就是叶子节点的最长路径,高度就比较好理解了一般我们看一个东西有好高都是从小面开始向上计算的,而深度就是从上向下计算,例如水有多深,最上面的肯定就是水面,所以深度是0,而层和深度类似,是树的深度加1,我们可以这样理解,一般一栋楼房的层数在都是从下面开始计算的,所以我们可理解成从顶层开始计算的一种楼房。

 

 

2.二叉树

 

    二叉树我们从名字上就可以看出来他每一个分叉只能有两个子节点(也就是一个父节点最多只能有两个子节点),分别是左节点和右节点。

 

 

 满二叉树

 

    所谓的满二叉树就是所有的叶子节点都在同一层,类似于上图中的图2,我们也可以为根据根节点左右能够对称的树叫满二叉树。

 

 完全二叉树

 

    完全二叉树相比满二叉树比较难理解,根据《大话数据结构》书中的解释,我觉得比较还是比较好理解,我们如果从根节点开始,从左到右定义一个顺序的编号,而如果节点是根据顺序走的那么就是完全二叉树,否则就不是;从下面图一种可以看出节点是完全根据顺序编号走的,而图二在第三层的时候右边两个没有节点,所以不是根据顺序走的,图三则是第四层第一个节点没有也不是根据顺序走的,图四第三层按照顺序编号第三个节点应该有数据而没有,所以也不是根据顺序编号走的。

 

 

3.二叉树的存储方式

 

    二叉树的存储方式分为链式和顺序存储两种,我们可以根据数组来存储,也可以根据链表来存储,实际中链表存储居多,基本上很少有使用数组来存储的,链式存储我们可以定义两个指针,分别指向左右子节点的地址。

 

 

    而数组存储就比较麻烦了,我们可以定义一个数组而数组中存放当前节点的数据,同时存放自己左右子节点的下标位置,当然这肯定不是一个简单的基本类型数组,而是一个类的数组,而这个类中存在着这三个变量,左右子节点的下标,以及自己的数据,当然这个时候你可能会说这样子是不是不太好找到自己的父节点了,那我们可以再加一个存放父节点下标位置的变量,根节点的父节点我们可以存储0。

 

 

4.二叉树的遍历

 

    二叉树的遍历可以分为三种,分别为前序遍历、中序遍历、后续遍历实际上这三个只是把输出数据的代码放在了不同的位置。前序遍历就是将输出节点的代码放在左右子树之前,而中序遍历就是放在左子树递归后面,右子树递归前面,也就是放在他俩中间,而后续遍历就是输出语句放在左右子树递归之后。

 

 

    最后看看遍历的时间复杂度,从我前面画的前、中、后序遍历的顺序图,可以看出来,每个节点最多会被访问两次,所以遍历操作的时间复杂度,跟节点的个数 n 成正比,也就是说二叉树遍历的时间复杂度是 O(n)。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值