0
点赞
收藏
分享

微信扫一扫

二叉搜索树详解与实现

绣文字 2022-01-09 阅读 35

二叉搜索树详解与实现

二叉搜索树概念

二叉搜索树又称二叉排序树,它具有以下这几种性质:

  1. 如果它的左子树不为空,则左子树上所有节点的值都小于根节点的值
  2. 如果它的右子树不为空,则右子树上所有节点的值都大于根节点的值
  3. 他的左右子树都是二叉搜索树

那么它为什么要叫做二叉排序树呢?
因为它的中序遍历就是一个有序的数列,所以我们一般用中序遍历来遍历二叉搜索树,并且也可以使用二叉搜索树的这个特性来检查当前二叉树是否是二叉搜索树。

二叉树的增删查改

上面我们了解了二叉树的一些特性了,那么下面我们就要开始实现底层的二叉搜索树了,和之前一样,我们还是从增删查改这四个方面入手。
首先,二叉搜索树是一个链表结构的,所以我们要先常见一个结构体来表示链表结构,该结构体中需要一个左节点指针,右节点指针和一个变量来存储值,具体如下:
在这里插入图片描述
一. 插入:
之后我们就可以实现以下它的增删查改了,首先我们先看二叉搜索树的插入操作:
对于二叉搜索树来说,它的左孩子的值永远比它的根节点的值小,它的有孩子的值永远比他的根节点的值大,那么这里我们就可以通过这个特性来构造一个二叉搜索树来,首先我们看要当前树是否是空树,如果是空树就直接创建一个节点,将值赋值给它就可以了,如果当前节点不是空树,那么我们就要查找当前节点应该存放的位置,如果我们遍历的节点比要插入的节点大的时候就在当前根节点的左子树中找,反之就在右子树中找,知道当前遍历的节点是空节点,那么这个位置就是要插入节点的位置,这里要注意几个问题,首先你要定义一个父亲节点变量pre用来记录插入节点的父亲节点是什么,用于插入操作,如果在树中存在和我们插入节点的数值一样的节点,那么就直接返回false,这样就完成了插入的任务,具体代码如下:
在这里插入图片描述
二. 查找
查找其实本质上和上面是插入的一部分,也是按照二叉搜索树的那个特性,左子树都比根节点小,右子树都比根节点大,所以我们可以通过这个特性来遍历一下这颗树,从而找到我们想要的节点,具体代码如下:
在这里插入图片描述
三. 删除
删除这里相对于上面两种操作就比较复杂了,因为我们要删除的节点不是每个都相同的,要删除的节点分为三种:
第一种是当前节点的左右子树都是空的,也就是叶子节点,此时我们不需要干别的,只需要把这个节点删除掉,让它的父亲节点指向空就可以了,这种情况很简单。
第二种就是当前节点的左子树为空或者当前节点的右子树为空,这种情况也很简单,只要我们将我们删除节点的左子树或者右子树托付给父节点就行了,也就是让父节点指向被删除节点的不为空那棵树就行了。
第三种情况就相对复杂起来了,当前被删除节点的左右子树都不是空,这个时候我们就不能像上面那样直接来删除当前节点了,而我们要做的是在删除当前节点的同时还要保证我们当前的二叉搜索树不受到破坏,所以我们要借助其他函数来实现删除操作,具体操作为,我们可以在被删除节点的子树中找到最接近该节点的数值的节点,让它的值和被删除节点的值进行交换,之后将删除操作改为删除这个找到的最接近节点值的节点,这样就可以完成了删除操作,那么如何查找最接近删除节点的值的节点呢,我们要按照二叉搜索树的特性来寻找,因为二叉搜索树的左子树比其根节点小,二叉搜索树的右子树比起根节点大,所以我们就找当前节点左子树的最右节点(比删除节点小的最大值)或者右子树的最左节点(比删除节点大的最小值),我们可以通过遍历来找到这个节点,找到之后也就可以完成删除操作了。具体代码如下:
在这里插入图片描述
这里要注意一种情况,就是我们的右子树的最左节点是否就是删除节点的右孩子节点,如果删除节点的右子树没有左节点那么就要进行判断一下,防止出现错误。

K类型二叉搜索树和KV类型二叉搜索树的底层代码实现

K类型二叉搜索树(一般用于查找单个数值)
在这里插入图片描述

KV类型二叉搜索树(一般用于根据一个变量关联出另一个变量)
在这里插入图片描述
这些就是二叉搜索树的大概内容,感谢阅读。

举报

相关推荐

0 条评论