浅谈数据结构--树

树(Tree)
在这里插入图片描述

一、相关概念

“树”这种数据结构与我们现实中的树十分相似,是一种非线性的数据结构。里面的每个元素我们称之为节点,这里有几个概念:父节点、子节点、兄弟节点、根节点、叶子节点。根据字面意思对照上图是否可以大致理解这几个概念呢?

  1. 父节点:图中的A、B、C、F节点都可以称为父节点
  2. 子节点:父节点向下延伸的节点,一个父节点可以有多个子节点,如A节点的子节点为B、C节点
  3. 兄弟节点:就是属于同一个父节点的子节点,如图中G、H节点同属于C节点,则G、H节点互为兄弟节点
  4. 根节点:毫无疑问最上边的节点A称为根节点,一棵树的根节点只有一个
  5. 叶子结点:没有子节点的节点称为叶子节点,即图中的D、E、I、G、H

除了上边的概念之外还有三个比较相似的概念:高度、深度、层

  • 高度: 从树的底层向上看,最下边节点所处的是第0层,之后每一层的高度加1,如上图所示,节点I的高度为0,节点D、E、F、G、H的高度为1,节点B、C的高度为2,根节点A的高度为3
  • 深度: 与高度相似,只不过是从上往下看,根节点的深度为0,之后向下每一层深度都加1,如上图所示,根节点A的深度为0,B、C节点的深度为1,D、E、F、G、H节点的深度为2,I节点的深度为3
  • 层: 层数与上边两个略有不同,起始计数为1,但是跟深度一样都是从上往下看,根节点为第1层,接着往下看,为第2、3、4层

二、二叉树

二叉树,顾名思义就是每个节点最多有两个子节点。分别称为左子节点右子节点。以此类推,N叉树就是每个节点最多有N个节点
满二叉树:除了叶子节点外,每个节点都有左右两个子节点
在这里插入图片描述
完全二叉树:除了最后一层的节点外,其他层节点必须都有左右子节点,此外最后一层的叶子节点都要靠左排列,这样的二叉树叫做完全二叉树
在这里插入图片描述
在这里插入图片描述

三、二叉树的存储方式

二叉树的存储方式有两种:

  • 基于指针或者引用二叉链式存储
  • 基于数组的顺序存储

链式存储:
在这里插入图片描述
如上图所示,链式存储法每个节点有三个部分,data区域存储数据,leftright分被是指向左子节点和右子节点的指针。我们只要知道根节点的位置,就可以一层一层的知道每层节点的位置。大部分的二叉树都是通过这种结构来实现的。

数组存储法:
在这里插入图片描述
如果节点x存储在数组中下标为i的位置,下标为2*i的位置存储的就是左子节点,下标为2*i+1的位置存储的就是右子节点。反过来,下标为i/2的位置存储就是它的父节点。通过这样的方法只要知道父节点就可以按规律计算出来其他的节点。正因为如此,所以完全二叉树采用数组存储的方式能够提高空间的利用率,并且不用像链表一样需要额外的空间来存储指向两个子节点的指针,仅仅是浪费一个空间。为什么要空出来数组的第一个位置呢?这样做是为了简化计算,从而可以根据根节点快速的计算出其它节点。如果不想浪费第一个空间,把第一个空间也用上,也可以根据规律推出相应的计算公式,但理解起来可能不如这种方式简单。

三、二叉树的遍历

常规的二插树遍历有三种方法:前序遍历、中序遍历、后续遍历
在这里插入图片描述
前序遍历: 前序遍历的“前序”指的是父节点的遍历顺序为最前边,也就是先遍历父节点,然后左节点,最后右节点。对应上图的遍历顺序就是A、B、D、I、F、J、C、G、H
中序遍历: 中序遍历就是父节点遍历的顺序处在左右子节点的中间,即先遍历左子节点,再遍历父节点,最后遍历右子节点。对应上图的遍历顺序就是I、D、B、J、F、A、G、C、H
后序遍历: 后序遍历就是父节点的遍历顺序在其与两个子节点中处于最后,即先遍历左子节点,再遍历右子节点,最后遍历父节点。对应上图的遍历顺序就是I、D、J、F、B、G、H、C、A

二叉树的三种遍历顺序对应的代码实现我在这里做阐述,但基本思路就是递归,以父节点和左右子节点为一组进行递归。

以上所述为本人在学习过程中所做的总结,如有不正确的地方还请各位大佬指出,谢谢!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值