github编辑

5、二叉搜索树与平衡二叉树(BST & AVL)

一、二叉搜索树

1.二叉搜索树是什么

二叉搜索树(BST,Binary Search Tree),又称二叉排序树或二叉查找树,是一棵二叉树,可以为空,当不为空时满足以下性质:

  • 非空左子树的所有键值小于其根结点的键值

  • 非空右子树的所有键值大于其根结点的键值

  • 左、右子树都为二叉搜索树 图源百度百科

2.二叉搜索树的操作函数

(1)二叉搜索树的查找操作Find

要查找的值为X

  • 从根结点开始查找,若树为空,则返回NULL

  • 若搜索树非空,则将X与根节点的键值进行比较并进行以下处理

    1. X小于根结点键值,则在左子树中搜索

    2. X大于根结点键值,则在右子树中搜索

    3. 若X与根结点键值相等,则搜索完成,返回指向该结点的指针

尾递归实现

迭代函数实现

(2)查找最大元素和最小元素

  • 最大元素一定是在树的最右分支的端结点

  • 最小元素一定是在树的最左分支的端结点在这里插入图片描述

查找最大元素

递归函数

迭代函数

查找最小元素

递归函数

迭代函数

(3)二叉搜索树的插入

要保证插入后还为二叉搜索树,关键时要找到元素应该插入的位置。

(4)二叉搜索树的删除

考虑三种情况

  • 要删除的是叶结点:直接删除,并修改其父结点的指针

  • 要删除的结点只有一个孩子结点:将其父节点的指针指向要删除结点的孩子结点在这里插入图片描述

  • 要删除的结点有左、右两棵子树:要用另一个结点替代被删除的结点(右子树的最小元素或左子树的最大元素)

二、平衡二叉树

1.平衡二叉树是什么

平衡二叉树AVL树,Banlanced Binary Tree ),可以为空,当不为空时满足以下性质:

  • 任一结点左、右子树高度差的绝对值不超过1

  • 给定结点数为n的AVL树的最大高度为O(log2n)!

平衡因子BF,Banlanced Factor):BF(T) = hL-hR,hL和hR分别为T的左、右子树高度

2.平衡二叉树的调整

RR插入——RR旋转【右单旋】

破坏结点(麻烦结点)位于被破坏结点(发现者)的右子树的右子树上 在这里插入图片描述

LL插入——LL旋转【左单旋】

破坏结点(麻烦结点)位于被破坏结点(发现者)的左子树的左子树上 在这里插入图片描述

LR插入——LR旋转

破坏结点(麻烦结点)位于被破坏结点(发现者)的左子树的右子树上 在这里插入图片描述

RL插入——RL旋转

破坏结点(麻烦结点)位于被破坏结点(发现者)的右子树的左子树上 在这里插入图片描述

ps:有时候插入元素即便不需要调整结构,也可能需要重新计算一些平衡因子

3.平衡二叉树实现

定义部分

左单旋

ps:A必须要有一个左子节点B,将A与B进行左单旋,并更新A与B的高度返回新的根结点B

右单旋

ps:A必须要有一个右子节点B,将A与B进行右单旋,并更新A与B的高度返回新的根结点B

LR旋转

ps:A必须要有一个左子节点B,且B必须有一个右子节点C 先将B与C做右单旋,返回C 再将A与C做左单旋,返回C

RL旋转

ps:A必须要有一个右子节点B,且B必须有一个左子节点C 先将B与C做左单旋,返回C 再将A与C做右单旋,返回C

插入

将X插入AVL树T中,并返回调整后的AVL树

完整代码演示

输出结果:

421365879 123456789

根据前序遍历与中序遍历易还原得到这样一个平衡二叉树

在这里插入图片描述

三、判断是否同一棵二叉搜索树

题意:给定一个插入序列确定唯一一棵二叉搜索树,对于输入的各种插入序列,判断它们是否能生成一样的二叉搜索树

如何判断两个序列是否对应相同搜索树呢 建一棵树,再判别其他序列是否与该树一致! 如输入3 1 4 2确定一颗二叉搜索树,判断3 4 1 2和 3 2 4 1是否对应同一棵树

1.搜索树表示

2.建搜索树T

3.判别一序列是否与搜索树T一致

方法:在树T中按顺序搜索序列3 2 4 1中的每个数

  • 若每次搜索所经过的结点在前面均搜索过,则一致

  • 否则(某次搜索中遇到了前面未出现的结点),则不一致

判断长度为N的插入序列产生的树是否与搜索树一致

清除T中个结点的flag标记使其为0

释放T的空间

最后更新于

这有帮助吗?