前言:平衡树的前置知识吧

二叉搜索树的定义:

二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树:

(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根节点的值;

(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;

(3)左、右子树也分别为二叉搜索树;

如图(一颗长残了的BST):

二叉搜索树的查询:

若根结点的关键字值等于查找的关键字,返回根节点的值。

否则,若小于根结点的关键字值,递归查左子树。 

若大于根结点的关键字值,递归查右子树。

若子树为空,则查找不成功。

假如我们要查询60

从根节点50开始,50 < 60 往右子树里找,到65,65 > 60 往右子树里找,找到60

二叉搜索树的插入:

与查询类似,判断在左子树还是右子树,走到叶节点后直接新加一个节点

如图我们要插入48

48 < 50,去左子树,到40

48 > 40,去右子树,到45

48 > 45,45没有子节点了,48成为45的右儿子

二叉搜索树的最值:

最小值:一直往左子树里找

最大值:一直往右子树里找

二叉搜索树的前驱/后继:

前驱是第一个比这个数小的值,后继是第一个比这个大的值

性质

  节点x的前驱一定没有右儿子,可能有左儿子(若前驱y有右儿子z,z大于y小于x,那z就是x前驱)

  节点x的后继一定没有左儿子,可能有右儿子(若前驱y有左儿子z,z小于y大于x,那z就是x前驱)

前驱:如果这个节点x有左子树,就以左儿子为根,查询左子树的最大值

     如果没有左子树(1):如果x为右儿子,前驱就是x的父亲

            (2):如果x为左儿子,前驱就是右父亲的左父亲(若没有左父亲,就一直往上找)

如图:

50的前驱是45。(前驱是左子树最大值)

45的前驱是40。(没有左子树且为右儿子,前驱是其父亲)

60的前驱是50。(没有左子树且为左儿子,前驱是其右父亲的左父亲)

30没有前驱。    【没有左子树且为左儿子,但在30的左父亲(祖先)里没有有左父亲的节点】


后继:如果这个节点有右子树,就以右儿子为根,查询右子树的最大值

    如果没有右子树(1):如果x为左儿子,后继就是x的父亲

           (2):如果x为右儿子,前驱就是左父亲的右父亲(若没有右父亲,就一直往上找)

同理如图:

50的后继是60。(前驱是右子树里最小的)

60的后继是65。(没有右子树且为左儿子,前驱是其父亲)

45的后继是50。(没有右子树且为右儿子,前驱是其左父亲的右父亲)

80无后继。   【没有右子树且为右儿子,但在80的左父亲(祖先)里没有有右父亲的节点】

二叉搜索树的删除:

删除有三种情况:

情况1:删除点为叶节点

    直接删除

对于30,45,60,80这四个节点,即使删掉也不会改变原树的平衡,故直接删掉

情况2:删除点右一个儿子

    直接用儿子替换删除点的位置

如70,因为以70为根的子树均大于65,所以删掉70后直接把70的儿子80接到70的位置并不会影响原树的平衡

如果删除点只有左儿子同理,所以删除点只有一个儿子的话可以直接用儿子替换删除点

情况3:删除点右两个儿子

    找到删除点的后继,用后继代替删除点,然后让后继的儿子替换后继的位置(情况2)

假设我们要删除65,那我们先找到65的后继67,把67放到65的位置上(因为65的右子树都大于65,所以67大于65的左子树,又因为67在65的右右子树里最小,所以67小于处67外的65的右子树,满足平衡条件),变成了这样

根据后继的性质,67没有左子树,只有一个右子树(一个儿子),因为67到了65的位置,所以67的位置空了出来(被删了),在加上67只有一个儿子,这不就是情况2吗,然后对67进行情况2的删除就可以了

若有什么错误或不足,还请不吝指出

二叉搜索树(BST)详解的更多相关文章

  1. C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解

    剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...

  2. 萌新笔记之二叉搜索树(BST)

    前言,以前搞过线段树,二叉树觉得也就那样= =.然后数据结构的课也没怎么听过,然后下周期中考... 本来以为今天英语考完可以好好搞ACM了,然后这个数据结构期中考感觉会丢人,还是好好学习一波. 二叉搜 ...

  3. 给定一个二叉搜索树(BST),找到树中第 K 小的节点

    问题:给定一个二叉搜索树(BST),找到树中第 K 小的节点. 出题人:阿里巴巴出题专家:文景/阿里云 CDN 资深技术专家. 考察点: 1. 基础数据结构的理解和编码能力 2.  递归使用 参考答案 ...

  4. [LeetCode] Convert BST to Greater Tree 将二叉搜索树BST转为较大树

    Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original B ...

  5. 二叉搜索树算法详解与Java实现

    二叉查找树可以递归地定义如下,二叉查找树或者是空二叉树,或者是满足下列性质的二叉树: (1)若它的左子树不为空,则其左子树上任意结点的关键字的值都小于根结点关键字的值. (2)若它的右子树不为空,则其 ...

  6. 在二叉搜索树(BST)中查找第K个大的结点之非递归实现

    一个被广泛使用的面试题: 给定一个二叉搜索树,请找出其中的第K个大的结点. PS:我第一次在面试的时候被问到这个问题而且让我直接在白纸上写的时候,直接蒙圈了,因为没有刷题准备,所以就会有伤害.(面完的 ...

  7. 二叉搜索树 (BST) 的创建以及遍历

    二叉搜索树(Binary Search Tree) : 属于二叉树,其中每个节点都含有一个可以比较的键(如需要可以在键上关联值), 且每个节点的键都大于其左子树中的任意节点而小于右子树的任意节点的键. ...

  8. 二叉搜索树(BST)学习笔记

    BST调了一天,最后遍历参数错了,没药救了-- 本文所有代码均使用数组+结构体,不使用指针! 前言--BFS是啥 BST 二叉搜索树是基于二叉树的一种树,一种特殊的二叉树. 二叉搜索树要么是一颗空树, ...

  9. 二叉搜索树(BST)

    (第一段日常扯蛋,大家不要看)这几天就要回家了,osgearth暂时也不想弄了,毕竟不是几天就能弄出来的,所以打算过完年回来再弄.这几天闲着也是闲着,就掏出了之前买的算法导论看了看,把二叉搜索树实现了 ...

  10. hdu 3791:二叉搜索树(数据结构,二叉搜索树 BST)

    二叉搜索树 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submiss ...

随机推荐

  1. Hadoop生态的配置

    网盘下载地址 链接: https://pan.baidu.com/s/19qWnP6LQ-cHVrvT0o1jTMg 密码: 44hs Hadoop伪分布式配置  Hadoop 可以在单节点上以伪分布 ...

  2. net core 小坑杂记之配置文件读取(不定期更新)

    其实很早就想写了,原想等积累差不多了再写的,但是发现遇到一个当时记下效果会比较好,所以就不定期更新这个系列了,后面获取会整个整理一下. 此篇记载net core入门时踩的一些坑,网上教程太少了,也不规 ...

  3. Mysql 中的MVCC原理,undo日志的依赖

    一. MVCC 原理了解   原文点击:MVCC原理浅析 读锁: 也叫共享锁.S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的 ...

  4. Django之路由分发反向解析

    Django路由分发|反向解析 当一个Django中有多个app时,路由会有很多,将这些路由都写在与项目同名的文件夹下就会显得很多,很乱.并且在协同开发的时候容易出现相同的命名,当项目合并后就会出现路 ...

  5. GFS浅析

    1 . 简介 GFS, Big Table, Map Reduce称为Google的三驾马车,是许多基础服务的基石 GFS于2003年提出,是一个分布式的文件系统,与此前的很多分布式系统的前提假设存在 ...

  6. Java使用Redis实现分布式锁来防止重复提交问题

    如何用消息系统避免分布式事务? - 少年阿宾 - BlogJavahttp://www.blogjava.net/stevenjohn/archive/2018/01/04/433004.html [ ...

  7. linux系统下MySQL表名区分大小写问题

    linux系统下MySQL表名区分大小写问题 https://www.cnblogs.com/jun1019/p/7073227.html [mysqld] lower_case_table_name ...

  8. centos6.7用yum安装redis解决办法及IP限制配置

    在centos6.7用yum安装redis解决办法 - bluesky1 - 博客园 http://www.cnblogs.com/lanblogs/p/6104834.html yum instal ...

  9. TCP 握手和挥手图解(有限状态机)

    1.引言 TCP 这段看过好几遍,老是记不住,没办法找工作涉及到网络编程这块,各种问 TCP .今天好好整理一下握手和挥手过程.献给跟我一样忙碌,找工作的童鞋,欢迎大神批评指正. 2.TCP 的连接建 ...

  10. jmeter内存溢出解决办法

    原文:http://blog.51cto.com/xqtesting/2107927 使用jmeter进行压力测试时遇到一段时间后报内存溢出outfmenmory错误,导致jmeter卡死了,先尝试在 ...