平衡二叉树之节点删除

    教书育人很重要,但也时刻告诫自己不要忘记IT男这个身份,再忙也要抽时间学习编程知识以及总结过去积累的经验。计算机算法,操作系统、计算机网络以及编译原理是成为计算机高手的内功。可能大多数人会觉得开发App,电脑软件,写个网站等这才是高手,其实相反,这些码农往往拿不到更高的薪水。掌握算法以及计算机底层的原理,是助你迈上更高台阶的关键,也是你拿到鹅厂这样的互联网大公司程序员岗位offer的必备技能【IT男并不是一定会修电脑,我们忙着打代码呢】。

    讲了这么多废话,也只是跟大家骚聊下算法的重要性。不久前小编分享了平衡二叉树的创建以及插入操作,类似于添加操作,从平衡二叉树中删除节点也分为两步,第一步完成节点的删除,第二步找到因为删除而导致不满足平衡二叉树要求的子树并对其进行调整。虽然平衡二叉树的结点删除操作的代码比较复杂,但是经过认真分析后,可以发现删除过程只有以下3种情况:

    ① 被删除的节点为叶子节点,就找到了要删除的节点

    ② 被删除的节点为只有一棵子树的节点就找到了要删除的节点【也就是被删的结点只有左子树或只有右子树】

    ③ 被删除的节点既有左子树,又有右子树

    我们需要知道这么一点,左子树上节点的删除相当于我们在右子树上插入了一个新节点,右子树上节点的删除相当于在左子树上插入了一个新节点,根据这一点,我们进行判断并采取对应的平衡调整操作。

我们按照这三种情况来一步步分析:

(1)被删的结点是叶子结点

    我们来看第一个例子

图1

    我们来删除节点14,发现这是个叶子节点,直接删除,可以发现节点14的父节点10达到平衡,再往上,发现根节点20也处于平衡状态,平衡因子为0。故删除节点后不需进行任何调整,得到的二叉平衡树如下:

图2

    我们来看例子2

图3

    我们将上图中的节点7删除,可以发现这是一个叶子节点。我们直接删除。得到下面的二叉树。

图4

    可以发现,原本节点7的父节点8的平衡因子为0,达到平衡。故继续向上查找,发现节点8的父节点20的左子树高度与右子树高度差值为2,也就是该节点20失衡。需要进行调整。这个地方要进行何种调整呢?我们说过,在左子树上删除节点其实就相当于在右子树上插入节点。我们找到节点20的右子树上的子节点30,发现节点30的左子树高度比右子树高,这就相当于在节点20的右子树节点30的左子树下插入了一个新的节点。这就需要进行RL型调整。先进行右旋调整,将节点30绕节点25顺时针旋转,得到下图。

图5

    接下来进行左旋,得到下图,这就是调整后的树的形状。

图6

    我们来看例子3

图7

    我们将上图中节点8删除,得到下图:

图8

    可以观察到该树处于失衡状态。节点20处于平衡状态,节点25的左右子树高度差为2,需要进行调整。刚我们说过,在左子树上删除节点其实就相当于在右子树上插入节点。但要如何调整还取决于该失衡节点的右孩子的左右子树的高度差。我们找到节点20的右子树上的子节点30,发现节点30的左右子树高度一样,因此我们只需进行RR型调整,也就是左旋一次,根据节点30进行逆时针旋转。调整后的树如下:

图9

    故删除叶子节点的几个步骤如下:

    ① 将该结点直接从树中删除;

    ② 其父节点的子树高度的变化将导致父结点平衡因子的变化,通过向上检索并推算其父结点是否失衡;

    ③ 如果其父结点未失衡,则继续向上检索推算其父结点的父结点是否失衡...如此反复②的判断,直到根结点;如果向上推算过程中发现了失衡的现象,则进行④的处理;

    ④ 如果其父结点失衡,则判断是哪种失衡类型[LL、LR、RR、RL],并对其进行相应的平衡化处理。如果平衡化处理结束后,发现与原来以父节点为根结点的树的高度发生变化,则继续进行②的检索推算;如果与原来以父结点为根结点的高度一致时,则可说明父结点的父结点及祖先结点的平衡因子将不会有变化,因此可以退出处理。

(2)被删的结点只有左子树或只有右子树

    我们来看看例子1

图10

    在该平衡树中,我们要删除的节点是值为29的节点。我们用该节点的左子树替换该节点,然后删除值为29这个节点。得到树的形状如下:

图11

    可以看到该树已经处于平衡状态。不需要进行处理。

    如果我们将值为40的节点删除,先用其右子树与之替换,然后删除该节点,可以得到如下的形状:

图·12

    接下来的操作其实也就是删除叶节点的操作。

    可以发现该树失衡,删除右子树的节点相当于在左子树上插入新的节点。我们找到值为50的节点,找到其父节点,节点值为30。然后找到其左孩子,节点值为25。发现该节点的右子树比左子树高度高,也就是相当于在左子树的右子树上插入节点。因此我们这里要进行LR型调整。先进行左旋,也就是绕值为29的节点进行逆时针旋转,得到下图:

图13

    接下来进行右旋,得到下图。

图14

    因此删除节点有左子树或右子树的处理步骤如下:    

    ① 将左子树(右子树)替代原有删除结点的位置;

    ② 结点C被删除后,则以C的父结点B为起始推算点,依此向上检索推算各结点(父、祖先)是否失衡;

    ③ 如果其父结点未失衡,则继续向上检索推算其父结点的父结点是否失衡...如此反复②的判断,直到根结点;如果向上推算过程中发现了失衡的现象,则进行④的处理;

    ④ 如果其父结点失衡,则判断是哪种失衡类型[LL、LR、RR、RL],并对其进行相应的平衡化处理。如果平衡化处理结束后,发现与原来以父节点为根结点的树的高度发生变化,则继续进行②的检索推算;如果与原来以父结点为根结点的高度一致时,则可说明父结点的父结点及祖先结点的平衡因子将不会有变化,因此可以退出处理

(3)被删的结点既有左子树又有右子树

    处理最初的步骤如下:

     ①  如果该节点的平衡因子为0或者1,则找到其左子树中具有最大值的节点max(我们只讨论有序平衡二叉树,并且有序平衡二叉树中任意一个节点的左子树上的所有节点的值小于该节点的值,右子树上所有节点的值大于该节点的值),将max的内容与x的内容交换(只替换保存的真正的数据,不替换指针,平衡因子等用于管理目的的信息),并且max即为新的要删除的节点。由于树是有序的,因而这样找到的节点要么是一个叶子节点,要么是一个没有右子树的节点。

    ② 如果该节点的平衡因子为-1,则找到其右节点中具有最小值的节点min,将min的内容与x的内容交换,并且min即为新的要删除的节点。由于树是有序的,因而这样找到的节点要么是一个叶子节点,要么是一个没有左子树的节点

    通过上面的操作后,我们需要对值替换后的节点进行删除,根据树的性质,我们可以得到我们要输出的节点只有两种情况,叶子节点或者是只有一棵子树的节点。删除后的调整操作按照我们前面已经讲的两种方法去调整。

    来看一个简单的例子

图15

    我们从该平衡树中删除节点20,我们分析得到节点20的平衡因子为1,因此我们从节点20的左子树中找到最大值,最大值为节点15。我们对两个节点的值进行替换。得到的树的形状如下所示:

图16

    接下来删除节点20,得到下图。

图17

    观察,发现原先删除的节点20的父节点10的平衡因子BF=2,处于失衡状态。因此需要对以10为根节点的子树进行调整【这个地方进行删除操作时,相当于在以10为根节点的左子树的右子树上进行插入操作】,也就是进行LR调整。要先进行一次左旋操作,得到下图

图18

    再进行一次右旋操作。最后得到的树的形状如下:

图19

    虽然平衡二叉树的结点删除操作的代码比较复杂,但是经过认真分析后,可以发现删除过程只有以上3种情况,牢牢把握住以上3点,理解并实现平衡二叉树的删除操作不是太难。

    有误请指正,感激不尽。下面是一段简洁的代码,总代码上篇简书以有贴图,这里只放相关代码截图。

图20
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容

  • 一、二叉查找树 1、定义:二叉查找树,也称二叉搜索树,或二叉排序树。其定义也比较简单,要么是一颗空树,要么就是具有...
    小小宁儿阅读 3,287评论 0 9
  • 要学习红黑二叉树,就得先了解二叉树是什么,二叉树是有限个元素得集合,这些元素集合构成树,二叉树允许集合元素个数为0...
    huwei30阅读 1,402评论 0 0
  • 转载请标明出处,谢谢!//www.greatytc.com/p/de829eab944c 关联文章冒泡、...
    若无初见阅读 2,057评论 0 3
  • 四、树与二叉树 1. 二叉树的顺序存储结构 二叉树的顺序存储就是用数组存储二叉树。二叉树的每个结点在顺序存储中都有...
    MinoyJet阅读 1,524评论 0 7
  • 今天早上,我和奶奶去我们家的地里割韭菜。土地里湿湿的,因为昨天下起了大雨。我们弄得脚上全是泥,我们拿着镰...
    高金鑫a阅读 90评论 0 0