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

1>前面我们已经讲了线性结构,栈,队列,链表等线性结构,今天我们来讲一下一种非常重要的非线性结构:树

 解释:你有没有发现非线性结构"树"和我们现实生活中的"树"很相似,这里面每一个点都是树的节点,节点与节点存在这某种关系,比如节点与节点相连接的关系叫做父子节点

解释:B,C,D的父节点是A,B,C,D被叫做兄弟节点,B,C,D是A的子节点,没有父子节点的节点叫做根节点,如图E,我们把没有子节点的节点叫做叶子节点,比如GHIJKL节点除此之外数据还有深度,高度,层的概念

                       高度:节点到叶子节点的最长路径(边数)

                       深度:根节点到这个节点所经历额边的个数

                      层数:节点的深度+1

                    树的高度:根节点的高度

  这3个概念容易比较混淆,我们必须明确,讨论高度,必须从下到上谈起,且从0为基准开始,讨论深度,必须从上到下谈起,也是以0作为基准.举个列子,一看就明白了

2>二叉树

   二叉树,顾名思义,每个节点做多有2个叉,一个左节点,一个右节点.,有的二叉树只有左节点,有的二叉树只有右节点,

   

                     上图是典型的二叉树,不过上图有2个特殊二叉树,2号图为满二叉树,3号图为完全二叉树

                     满二叉树:除了叶子节点,没个节点都有左节点和右节点,这样的二叉树是满二叉树                  

                      完全二叉树:叶子节点都在最第底下的2层,最后一层的叶子节点都靠左排列,并且除了最后一层,其他节点的个数要达到最大,

3>二叉树的存储方式

                  我们先看一下数的链式存储方式,

                解释:      我们可以很清楚的看到,每个节点都分为3部分,一部分存储数据,另外2部分分别是指向左右节点的指针,我们主要抓住根节点就可以把整个二叉树挂起来.

         基于数组的存储方式 

   我们把根节点的下标设置为1那么A的左节点的下标为2*i,则右节点的下标为2*i+1,以此类推,B的右子节点的下标为 2*i=4,右节点的下标为2*i+1,我们只要知道根节点的下标,就可以计算出每个节点的下标位置,i/2是它的父节点  2i+1是右节点  2i是左节点.

 根据数组的存储方式,对于完全二叉树来树,根节点的下标是从1开始的,所以他会浪费数组的一个存储空间,即第0个位置

  我们举一个非完全二叉树的列子,我们来看看他在数组中的存储方式

总结,无疑的是,如果是以个完全的二叉树,使用数组的方式是最节省空间的,用数组来实现完全二茶叉树的存储,只是需要浪费一个存储空间,但是基于链表方式,我们需要更到的内存空间开存储每个节点的指向左右节点的指针,这也是为什么完全二叉树的最后一层的子节点都靠左的原因,为了防止浪费更多的内存空间.

3>二叉树的遍历

      二叉树的遍历右3种方式,分别是前序遍历(根左右),中序遍历(左根右),后续遍历(左右根),遍历的具体操作请进行百度..

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值