二叉搜索树在二叉树的基础上加了一条规则,就是结点的左子树的值小于根节点,而节点右子树的值大于根节点,这样的结构的好处是当二叉搜索树的每个节点差小于等于一时搜索数据的时间复杂度与二分查找一样都是logn,他的作用价值还有一处就是它在中序遍历时会将所有的数据排序输出,同样对于一组乱序数据,若是普通的排序和搜索将会耗费大量的时间,而构建一个二叉搜索树并查找和排序的时间复杂度将会大大减小建树的时间复杂度为n倍的logn,查找的时间复杂度更是达到了logn,这极大地加快了数据处理的效率。
搜索二叉树用自定义类来作为每个节点。
在建树时需要进行特殊处理将数据插入到特殊的位置,当根节点为空时直接将数据插入到根节点中,若不是根节点则需要判断每个节点若要插入的数据大于当前节点则循环进入到当前节点的右子树中,若小于迭代进入左子树,若找到了就放进去。
值得注意的是:迭代后存数据的节点放入数据后还没完,还要将当前节点的双亲结点的子节点指向插入的节点,使之跟二叉搜索树连接起来,所以在迭代的时候需要记录当前节点的上一个节点。
接下来是搜索二叉树的寻找函数,这个比较简单,常规的寻找语句:
最后就是搜索二叉树的删除函数;
这个比较复杂,因为需要在删除节点的同时保证搜索二叉树不被破坏,所以可以分为以下几种情况:
1.删除的是叶子节点,2,删除的是一个子树为空的节点,3.删除的节点两个子树都不为空:
其中叶子节点的删除可以包含在一个子树为空的节点中视为一种情况。
想要解决这两种情况就要具体分析:
1.找到要删除的节点,先判断此节点若是属于第一种情况,就是结点的一棵子树为空,那么只需要让此节点的双亲结点继承此节点中不为空的那一个子树,再将此节点释放就完成了删除。
值得注意的是让双亲节点链接其不为空的子树时,需要判断其位于双亲结点的哪一棵子树上,避免放错将树破坏。
还有需要注意的第二点,若是此时被删除的节点为根节点,所以他没有记录的双亲结点,因为开始定义的双亲结点为空,按照上面说明的算法,就会出现双亲节点空指针访问的错误。因此此情况需要特殊处理,可以直接释放掉根节点的空间,再让根节点指向其一个非空的子树。
2.第二种情况更难分析,因为要删的节点其子树都不为空,那么怎样删除呢,我们知道二叉搜索树的节点左子树中的值都小于此节点,而右子树中的值都大于此节点,那么先找到其右子树中最小的值,与要删除的值交换,那么要删除的节点就被放在了一颗其中一个子树为空的树的根节点上,因为一颗二叉搜索树的最小节点总是在树的最右侧,而被交换的数放在了被删节点上,又因为这个数是此子树中的最小值,除了要删除的节点并没有破坏二叉树搜索树,所以接下来只需要删除被换掉的要删除的节点即可,因为被放在最小位置的节点的右子树可能还有数据,所以此时的删除方式为第一种删除方式。
但是这其中又有需要注意的一点,就还是根节点问题,一棵二叉搜索树的右子树的最小节点除了最右边的节点为,若是此子树为根节点的一颗子树为空的子树,那么这颗二叉搜索树的最小节点为根节点,若是按照上面的算法去访问根节点的左子树,就又会出现非法访问空结点的错误,所以需要加一种条件判断,若根节点的左子树为空则直接让其双亲结点链接此树的根节点,此时这个小问题就解决了。
上图:
这三张图是第一种情况的删除方法。
这是第二种情况的删除方法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人