二叉树形冲突分解算法仿真_数据结构与算法-二叉查找树平衡(DSW)

上一节探讨了二叉查找树的基本操作,二叉查找树的查找效率在理想状态下是O(lgn),使用该树进行查找总是比链表快得多。但是,该论点并不总是正确,因为查找效率和二叉树的形状息息相关。就像这样:图1-1给出了3颗二叉查找树,它们存储着相同的数据,但很明显,图1-1(A)的树是最好的。在最坏的情况下,图A定位一个对象需要3次测试,图C需要6次。原因在于,图C的数据不是平均分布的,该树实际上已经退化成一个链...
摘要由CSDN通过智能技术生成

上一节探讨了二叉查找树的基本操作,二叉查找树的查找效率在理想状态下是O(lgn),使用该树进行查找总是比链表快得多。但是,该论点并不总是正确,因为查找效率和二叉树的形状息息相关。就像这样:

7442b404cfddf713830f1bbf182eca98.png

图1-1给出了3颗二叉查找树,它们存储着相同的数据,但很明显,图1-1(A)的树是最好的。在最坏的情况下,图A定位一个对象需要3次测试,图C需要6次。原因在于,图C的数据不是平均分布的,该树实际上已经退化成一个链表,已经失去了二叉查找树的优越性。

这里需要引入一个新的概念,叫做平衡。如果树中任一节点的两个子树的高度差为0或者1,该二叉树就是高度平衡的或者简称平衡的。例如,图B中的节点20,其子树的高度差是1,这是可以接受的。 但是对于节点10,其子树的高度差是3,这意味着整棵树是不平衡的。另外,如果树是平衡的,并且该树所有叶节点都出现在一个或者两个层次上,那么该树是完全平衡的。

那么问题来了,如何得到一颗平衡的二叉查找树?

许多技术都可以适当的平衡二叉树。一些技术对数据重新排序从而创建一颗平衡的二叉树,另一些技术在由于插入或者删除元素而导致树不平衡时,会重新平衡树。我们首先来探讨如何创建一颗平衡二叉查找树,然后介绍如何重新平衡已有的二叉查找树。

想要创建一颗平衡二叉查找树,首先要观察这种树的特性,根据观察到的规律总结出来的数学逻辑,其实就是算法。就像下面:

99c4686cb9e952c540251e6573b736d8.png

发现了吗?如果将一颗完美的平衡的二叉查找树压平,将数据线性列出,你会发现它是有序的,并且根节点30处于数组A中间的位置。不止如此,根节点30的左子树的根节点20处于数组B的中间位置,根节点30的右子树的根节点47处于数组C的中间位置。以此类推,所有子树的根节点总是处于某个数组的中间位置。这很类似二分查找的逻辑,并且你是否发觉,数组A其实是该二叉树中序遍历的结果。

这里有个定论:二叉查找树的中序遍历可以得到有序的数据流

证明也很容易,这里使用自然语言简单描述下:

假如要对一颗二叉查找树进行中序遍历,首先将其分解成根节点,左子树,右子树。因为中序遍历的逻辑是首先遍历左子树,然后是根节点,最后是右子树。我们可以将它们放到一个栈中,大概长得是这个样子:

e35d4f298df6898a583f6050aa721f1e.png

根据二叉查找树的定义,左子树所有节点小于根节点,右子树所有节点大

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值