算法与数据结构 --- 查找 --- 树表的查找

第一部分 --- 二叉排序树

 

1.注意!左子树是所有结点均小于根结点,而右子树则是所有结点均大于等于根结点

 

1.对二叉排序树进行中序遍历的话,则是小 - 中 - 大的遍历节奏

 1.二叉排序树的查找终止条件有两个:一个是找到了,查找结束;另一个则是查找到空结点的时候,即查找失败(找不到)的时候,查找结束

 

 

1.第一步是看看指针为不为空,如果为空就返回个空指针表示查找失败,若不为空的话,则看看指针指向的结点的key值和我们给定的key值是否相等,如果相等的,查找成功,返回这个指针,若不相等的话则在进行第二次判断后进行递归

1.树的深度就等于树的最大层数

1.当顺序二叉树从判别树的形态转变为单支树的形态的时候,就相当于我们从二分查找退化为了顺序查找,此时查找的时间复杂度增加

1.根据上面我们可以得到结论:二叉排序树的形态越趋近于二分查找的判别树的话,也就是树的左右形态越平衡的话,对二叉排序树进行查找的时间复杂度越低

2.左右形态不平衡的二叉排序树经过 平衡化 处理后得到的二叉树就是平衡二叉树

1.按照规则在树中查找我们要插入的元素的时候,如果没找到的话那就一直找,停止条件有两个:

一个是找到了,找到了就什么都不做;

另一个则是找到空结点,如果找到的是空结点的话,则在这个空结点的位置插入我们要插入的元素

1.给定一个关键字序列,我们如何生成对应的二叉排序树呢?

答案就是:一.生成一颗空的二叉排序树;二.在关键字序列中选择一个元素在我们的空二叉排序树种执行二叉排序树的插入操作,插入完成后再选择另一个元素进行在上一个二叉排序树中执行插入操作,然后再继续选择并进行插入,直到关键字序列中的所有的元素都执行了插入操作,且只执行了一遍之后,对应的二叉排序树就生成好了

1.一个关键字序列可以生成不同的二叉排序树,这是取决于我们一开始选择的二叉排序树的根结点是那个,根结点不同得到的二叉排序树的形态就不同 --- 选的好的根结点可以使得形态平衡,降低时间复杂度,选的差则适得其反。

1.删除结点后,二叉排序树会在删除的结点处出现结点断开的情况,此时为了保证删除结点后我们得到的依然是二叉排序树,我们需要按照二叉排序树的定义将断开的地方处的结点重新链接起来

链接时的原则是:链接后的新的排序二叉树的高度不能够比没断开时的排序二叉树的高度大(即树的层数不能够增加)

 

直接替换这个操作是符合二叉排序树的定义的,而且还没有增加层数

二叉排序树种一个结点的直接前驱结点是:这个结点的左子树中的最大结点

直接后继结点则是:这个结点的右子树中的最小结点

1.当我们想要删除一个同时具有左右子树的结点,而又不破坏二叉排序树的有序结构的话,我们可以用这个结点的直接前驱或者是直接后继来替换掉这个结点

2.用直接前驱 / 直接后继替换了结点之后,我们还需要将这个直接前驱 / 直接后继从它在二叉排序图中原来的位置删除掉,这样才能够保证新的二叉排序树的有序结构是删除了结点后的有序结构

3.在删除的结点后,我们是选择直接前驱还是直接后继来替换这个结点呢?判断标准如下:

如果用直接前驱替换后得到的新的二叉排序树的形态比用直接后继替换后的二叉排序树的形态更平衡,那就用直接前驱来替换,反之同理

(注意:结点能够替换的前提是替换后得到的二叉排序树的层数要小于或等于删除结点前的二叉排序树的层数)


第二部分 --- 平衡二叉树

1.最好的情况其实就是二叉排序树的形态和二分查找的判别树的形态相同(形态均衡),此时在二叉排序树中进行查找的算法时间复杂度就和二分查找的算法时间复杂度一样

2.最坏的情况就是二叉排序树的形态为单支树的形态,此时在二叉排序树中查找某一个结点的流程就相当于进行顺序查找,所以算法的时间复杂度也和顺序查找的算法时间复杂度一样

1.平衡二叉树其实就是多了两个性质的二叉排序树:

一.平衡二叉树的左子树与右子树的高度之差的绝对值小于等于1

二.平衡二叉树的左子树和右子树也是平衡二叉树

 

 

1.在一棵平衡二叉树中插入和删除结点的话就可能导致平衡二叉树 “ 失衡 ”变为非平衡二叉树,此时我们可以通过改变非平衡二叉树的结构来使之恢复平衡

1.当我们向平衡二叉树中插入或删除顶点后,导致二叉树中出现平衡因子的绝对值不等于1的顶点时,平衡二叉树失衡变为非平衡二叉树,这个平衡因子的绝对值不等于1的顶点就是失衡结点

2.一个非平衡二叉树中可能有多个失衡结点

3.在做平衡调整的时候我们都是针对一个失衡结点来调整的,当有多个失衡结点的时候,我们该调整那一个失衡结点呢?

答案就是当有不止一个失衡结点的时候,选择最小失衡子树的根结点

所谓的失衡子树就是以失衡结点作为根结点的原树的子树,最小失衡子树就是指所有失衡子树中拥有顶点数最少的那个子树

1.通过向平衡二叉树中插入元素导致的失衡分为上面四种类型

1.只要调整之后符合上面三个原则,那么我们的调整就是成功的(补充一个原则:就是不能够删除结点以及再添加结点,只能够对已有的结点进行结构调整)

2.比如LR型,加入C结点之后,三个结点的大小关系是: A > C > B,如果进行平衡调整的话我们可以将C作为根结点,最小的B作为左子树,最大的A作为右子树

这样子调整之后,不仅降低了树的高度,而且还符合排序二叉树的性质

 

 

 

 

 

给定一个关键字序列,我们如何获得对应的平衡二叉树呢?

 

1.基础思想是在创建关键字序列的对应的二叉排序树的时候,如果出现了失衡就及时调整,保证每一次创建的二叉排序树都是处于平衡树,这样最终得到的二叉排序树就是对应的平衡二叉树

2.具体步骤:

一.创建一个空二叉排序树,然后将关键字序列中的第一个元素以二叉排序树的方式插入方式插入到树中

二.判断插入后的二叉排序树中是否出现失衡结点,如果出现,进行平衡调整,调整完后执行第三步;如果没出现,那就直接执行第三步

三.将关键字序列中的下一个元素插入到二叉排序树种,并执行的二步(如果下一个元素为空,即所有的元素都已经插入完的话,停止插入,输出创建好的关键字序列的平衡二叉树)

1.如果说排序二叉树中出现了多个失衡结点的话,我们优先进行平衡调整的是最小失衡子树的根结点(即失衡子树中结点数最小的树的根结点)

2.对非平衡二叉树的调整步骤:

一.计算所有结点的平衡因子,找到所有失衡结点并判断优先进行平衡处理处理的是那个失衡结点,处理完后执行步骤二

二.重新计算排序二叉树中所有结点的平衡因子,如果还有失衡结点的话,执行步骤一,如果没有的话调整结束

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值