数据结构——4.1 二叉搜索树

一、二叉搜索树

一棵二叉树,可以为空;如果不为空,满足以下性质:
1)非空左子树的所有键值小于其根结点的键值
2)非空右子树的所有键值大于其根结点的键值
3)左右子树都是二叉搜索树
在这里插入图片描述

二、二叉搜索树操作的特别函数

1、查找

在这里插入图片描述

1)Find

① 查找从根结点开始,如果树为空,返回NULL
② 若搜索树非空,则根结点关键字和X进行比较,并进行不同处理

  • X小于根结点键值,只需要在左子树中继续搜索
  • X大于根结点键值,只需要在右子树中继续搜索
  • 若两者比较结果是相等,搜索完成,返回指向此结点的指针。
    在这里插入图片描述
    在这里插入图片描述
    上面的方式是一种尾递归,都知道递归的效率不是很高,尾递归是在程序分支的最后(在返回的时候)出现递归,从编译的角度将,尾递归都可以用循环来实现,改为迭代函数:
    在这里插入图片描述
    查找的效率和树的高度有关。如果没有左子树或没有右子树,就形成了一条链,就达不到O(logn)的效果了,所以总的来说我们希望这个树看起来比较平衡,就不往一边倒

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

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

在这里插入图片描述
所以搜索树的最大元素结点,一定没有右儿子
在这里插入图片描述

2、插入和删除

在这里插入图片描述

1)二叉搜索树的插入

关键是要找到元素应该插入的位置,可以采用与find类似的方法。
在这里插入图片描述

在这里插入图片描述

例子

在这里插入图片描述

2)二叉搜索树的删除

考虑三种情况:
① 要删除的是叶节点:直接删除,并再修改其父结点指针–置为NULL
② 要删除的结点是只有一个孩子的结点:将其父结点的指针指向要删除结点的孩子结点
在这里插入图片描述
③ 要删除的结点有左、右两棵子树:用另一结点代替被删除的结点:右子树的最小元素或者左子树的最大元素
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/CSDN_dzh/article/details/83751070