二叉树及其验证

二叉树
二叉查找树
2.1 二叉查找树的查找
2.2 二叉查找树的插入
2.3 二叉查找树的删除
2.4 二叉查找树的时间复杂度分析
2.5 二叉查找树的总结
平衡二叉树
3.1 平衡二叉树的概念
3.2 平衡二叉树带来的问题
红黑树
4.1 红黑树近似平衡的简单证明
总结
1:二叉树
二叉树可以分为以下几种:

普通二叉树——对应编号1
满二叉树——对应编号2
完全二叉树——对应编号3


(1)普通二叉树

编号1,由一个根节点加上两棵分别称为左子树和右子树组成
(2)满二叉树

编号 2 的二叉树中,叶子节点全都在最底层,除了叶子节点之外,每个节点都有左右两个子节点
(3)完全二叉树

编号 3 的二叉树中,叶子节点都在最底下两层,最后一层的叶子节点都靠左排列,并且除了最后一层,其他层的节点个数都要达到最大
在理解二叉树的定义和类别后,进一步思考,如何存储一棵二叉树?

想要存储一棵二叉树,一种方法是基于指针或者引用的二叉链式存储法,一种是基于数组的顺序存储法。

下图表示的就是二叉树的链式存储法,链式存储更为直观,也比较简单。图中,每个节点有三个字段,其中一个存储数据,另外两个指向左右子节点的指针。只要找到根节点,就可以通过左右子节点的指针,把整棵树都串联起来,大部分二叉树都是通过这种结构实现的。

另一种方法,如下图所示,基于数组的顺序存储法,图中,我们把根节点A存储在下标i=1的位置,那么左子节点B存储在下标2*i=2的位置,右子节点C存储在2 * i +1=3的位置,以此类推。总结:如果节点X存储在数组中下标为i的位置,下标为2i的位置存储的就是其左子节点,下标为2 * i +1的位置存储的就是右子节点,反过来也可以倒推。因此,我们只要知道根节点的存储位置(一般情况下,为了方便计算,根节点都会存储在下标为1的位置),这样就可以通过下标计算,把整棵树的节点串联起来。

由于图中显示的是一颗完全二叉树,所以仅仅浪费了一个下标为0的存储位置。

下图中,由于是一个非完全二叉树,所以在用数组存储的时候,会浪费比较多的存储空间。

二叉树的遍历

遍历有三种方式:前序遍历、中序遍历和后序遍历。其中,前、中、后序,表示的是节点与它的左右子树接地那遍历的先后顺序

前序遍历是指,对于树中的任意节点来说,先打印这个节点,然后再打印它的左子树,最后打印它的右子树——根左右

中序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它本身,最后打印它的右子树——左根右

后序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它的右子树,最后打印这个节点本身——左右根

2:二叉查找树
二叉查找树是二叉树中最常用的一种类型,是为了实现快速查找的,不仅仅支持快速查找一个数,还支持快速插入和删除数据。二叉查找树的这些性能都依赖于二叉查找树的特殊结构,二叉查找树的要求,在树中的任意一个接地那,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都要大于这个节点的值。

2.1:二叉查找树的查找
如果需要查找一个数,首先取根节点,如果它等于要查找的数据,则直接返回,如果小于要查找的数据,则在右子树中继续查找,如果大于要查找的数据,则在左子树中继续查找,也就是二分查找的思想,这样一直递归。

2.2:二叉查找树的插入
二叉树的插入类似于查找过程,首先还是从根节点开始,然后依次比较要插入的数据与接地那的关系。如果要插入的数据比节点的数据大,并且节点的右子树为空,就将新数据直接插到右子节点的位置;如果不为空,就再递归遍历右子树,查找插入位置。同理,如果要插入的数据比节点的数据小,也是类似的操作。

2.3:二叉查找树的删除
二叉查找树的删除相对于查找和插入要稍微复杂一点。主要有3种情况需要考虑:

如果要删除的节点没有子节点,只需要将父节点中,指向阐述接地那的指针置为NULL,比如删除图中的节点55
如果要删除的节点只有一个子节点(只有左子节点或者右子节点),只需要删除父节点中,指向要删除的指针,让它指向要删除的节点的子节点就可以了。比如要删除图中节点13
如果要删除的节点上有两个子节点,要稍微复杂一点。首先找到这个节点的右子树中最小的节点,把它替换到要删除的节点,然后再删除这个最小节点。因为最小节点肯定没有左子节点。比如删除节点18


2.4:二叉查找树的时间复杂度分析
二叉查找树的形态各式各样。比如这个图中,对于同一组数据,我们构造了三种二叉查找树,它们的查找、插入、删除操作的执行效率都是不一样的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值