证明 getBalanceFacter(node)>1 && getBalanceFacter(node.left)>=0就是向node的左子树的左边添加了节点

来源:12-4 旋转操作的基本原理

何时才能成大佬

2019-10-11

对于任意一个节点NODE
如果它是平衡的,那么其必满足下面三种情况之一:
NODE左子树高度-NODE右子树高度=-1
NODE左子树高度-NODE右子树高度=0
NODE左子树高度-NODE右子树高度=1

那么:

假设不平衡的节点node在未插入新节点时左子树的高度为HL,右子树的高度为HR,那么插入新节点之前有以下三种情况:
①HL-HR=-1 (node的左子树低,右子树高)
②HL-HR=0 (node的左子树和右子树高度相同)
③HL-HR=1 (node的左子树低,右子树低)

当添加新节点之后,若node节点不平衡,则有以下情况:
/****情况一、/
一、getBalanceFactor(node)>1 即HL-HR>1
因为node节点之前是平衡的,插入节点后造成了node的不平衡, 所以:插入节点之前HL-HR=1,插入插入节点之后HL-HR=2>1

由HL-HR=1 —> HL-HR=2 只能是HL加了1(HR不可能减1)
所以新添加的节点一定添加到了node的左边

在此情况下,添加新节点后node一定有左节点

假设
node的左节点为node.left
添加节点后
node.left的左子树高度为hL(hL>=0),右子树高度为hR(hR>=0)
/*********************************************************/
(1)getBalanceFactor(node.left)>=0 即hL - hR>=0
又因为node.left是平衡的,所以此时有两种情况:

<1>hL-hR=0

当由hL-hR=-1 -> hL-hR=0 则是因为hL加了1,此时意味着新节点添加在了node.left的左边。

当由hL-hR=0 -> hL-hR=0 则不可能(此时意味着hL和hR都没变,那么node.left的高度也不会变,又因为node.right的高度没改变,且插入新节点之前node是平衡的,所以此时node不可能不平衡。)

当由hL-hR=1 -> hL-hR=0 则不可能(此时意味着hR加了1,但是在添加节点之前hL>hR(hL-hR=1),添加节点之后hL=hR,所以添加后node.left的高度也不会变( max{hL,hR}+1没变 ),又因为node.right的高度没改变,且插入新节点之前node是平衡的,所以此时node不可能不平衡。)

<2>hL-hR=1

当由hL-hr=-1 --> hL-hR=1 则不可能(插入新节点后hL和hR只能变化一个,且变化的范围为+1、-1、0)

当由hL-hR=0 --> hL-hR=1 则是因为hL加了1,此时意味着新节点添加在了node.left的左边。

当由hL-hR=1 -->hL-hR=1 则不可能(此时意味着hL和hR都没变,那么node.left的高度也不会变,又因为node.right的高度没改变,且插入新节点之前node是平衡的,所以此时node不可能不平衡。)
/*******************************************************************/

由一、(1)中的<1><2>可得,新插入的节点在node的左子树的左边

剩下的情况
一、(2)
二、(1)
二、(2)

还没学,所以还没写,请问bobo老师我这样推导正确吗?

写回答

2回答

liuyubobobo

2019-10-11

大赞!感谢分享!:)


继续加油!:)

0
1
何时才能成大佬
非常感谢!
2019-10-11
共1条回复

何时才能成大佬

提问者

2019-10-12

对于不平衡条件的证明:

对于node节点不平衡,有四种情况

第一、新节点插入到了node左子树的左边

第二、新节点插入到了node左子树的右边

第三、新节点插入到了node右子树的右边

第四、新节点插入到了node右子树的左边

 

 

① getBalanceFactor(node)>=1 && getBalanceFactor(node.left)>=0

(LL)

因为: 插入新节点之后对node节点有

getBalanceFactor(node)>=1

即: node.left.height-node.right-height>=1

综合代码性质,有

node.left.height-node.right-height=2 (1)

因为: 插入新节点之前node节点是平衡的

所以: 插入新节点之前对node节点有

-1<=getBalanceFactor(node)<=1

即: 插入新节点之前对node节点有三种情况

node.left.height-node.right.height=-1 (2)

node.left.height-node.right.height=0 (3)

node.left.height-node.right.height=1 (4)

 

对于: 插入新节点之前和插入新节点之后

·当node节点由式(2)变为式(1)时,此时该情况不可能出现。

·当node节点由式(3)变为式(1)时,此时该情况不可能出现。

·当node节点由式(4)变为式(1)时,此时必是由于插入新节点后 node.left.height增加了1。故此时插入的新节点必在node节点左子 树中。

故: 新插入的节点必在node左子树中。

 

 

 

 

因为: 插入新节点之后对node.left节点有

getBalanceFactor(node.left)>=0

即: node.left.left.height-node.left.right.height>=0

因为: 插入新节点之后node.left节点是平衡的

所以: 插入新节点之后对node.left节点有两种情况

node.left.left.height-node.left.right.height=0 (5)

node.left.left.height-node.left.right.height=1 (6)

因为: 插入新节点之前node.left节点也是平衡的

所以: 插入新节点之前对node.left节点有

-1<=getBalanceFactor(node.left)<=1

即: 插入新节点之前对node节点有三种情况

node.left.left.height-node.left.right.height=-1 (7)

node.left.left.height-node.left.right.height=0 (8)

node.left.left.height-node.left.right.height=1 (9)

 

对于: 插入新节点之前和插入新节点之后

·当node.left节点由式(7)变为式(5)时

此时必是由于插入新节点后node.left.left.height增加了1。

而插入新节点前

node.left.left.height<node.left.right.height

插入新节点前后

node.left.left.height=node.left.right.height

所以插入新节点前后

max(node.left.left.height,node.left.right.height)未改变

所以插入新节点前后node.left.height的高度未改变

则node的平衡因子也未改变

而插入新节点前node是平衡的

故插入新节点之后node也是平衡的

此时node不可能满足条件①

故此时该情况不可能出现

 

·当node.left节点由式(8)变为式(5)时

此时node.left.left.height 和node.left.right.heigh都未改变

所以node.left的高度也未发生改变

则node的平衡因子也没改变

而node插入新节点之前是平衡的

故插入新节点之后node也是平衡的

此时node不可能满足条件①。

故此时该情况不可能出现。

 

·当node.left节点由式(9)变为式(5)时

此时必是由于插入新节点后node.left.right.height增加了1

而插入新节点前

node.left.left.height>node.left.right.height

插入新节点前后

node.left.left.height=node.left.right.height

所以插入新节点前后

max(node.left.left.height,node.left.right.height)未改变

所以插入新节点前后node.left.height的高度未改变

则node的平衡因子也未改变

而插入新节点前node是平衡的

故插入新节点之后node也是平衡的

此时node不可能满足条件①

故此时该情况不可能出现

 

·当node.left节点由式(7)变为式(6)时

此时该情况不可能出现

 

·当node.left节点由式(8)变为式(6)时

此时必是由于插入新节点后node.left.left.height增加了1

故此时插入的新节点必在node.left的左边

 

·当node.left节点由式(9)变为式(6)时

此时node.left.left.height 和node.left.right.heigh都未改变

所以node.left的高度也未发生改变

则node的平衡因子也没改变

而node插入新节点之前是平衡的

故插入新节点之后node也是平衡的

此时node不可能满足条件①。

故此时该情况不可能出现。

故: 新插入的节点必在node.left的左边。

 

 

 

综上: 新插入的节点必在node左子树的左边。

 

②getBalanceFactor(node)>=1 && getBalanceFactor(node.left)<0

(LR)

因为: 同LL

所以: 新插入的节点必在node左子树中

故: 新插入的节点必在node左子树中。

 

因为: 插入新节点之后对node.left节点有

getBalanceFactor(node.left)<0

即: node.left.left.height-node.left.right.height<0

因为: 插入新节点之后node.left节点是平衡的

所以: 插入新节点之后对node.left节点只有一种情况

node.left.left.height-node.left.right.height=-1 (10)

因为: 插入新节点之前node.left节点也是平衡的

所以: 插入新节点之前对node.left节点有

-1<=getBalanceFactor(node.left)<=1

即: 插入新节点之前对node节点有三种情况

node.left.left.height-node.left.right.height=-1 (11)

node.left.left.height-node.left.right.height=0 (12)

node.left.left.height-node.left.right.height=1 (13)

 

对于: 插入新节点之前和插入新节点之后

·当node.left节点由式(11)变为式(10)时

此时node.left.left.height 和node.left.right.heigh都未改变

所以node.left的高度也未发生改变

则node的平衡因子也没改变

而node插入新节点之前是平衡的

故插入新节点之后node也是平衡的

此时node不可能满足条件①。

故此时该情况不可能出现。

 

·当node.left节点由式(12)变为式(10)时

此时必是由于插入新节点后node.left.right.height增加了1

故此时插入的新节点必在node.left的右边

 

·当node.left节点由式(13)变为式(10)时

此时该情况不可能出现

故: 新插入的节点必在node.left的右边。

 

 

 

综上: 新插入的节点必在node左子树的右边。

 

 

③getBalanceFactor(node)<=-1 && getBalanceFactor(node.left)>=0

(RR)

因为: 同LL

综上: 新插入的节点必在node右子树的右边。

 

④getBalanceFactor(node)<=-1 && getBalanceFactor(node.left)>=0

(RL)

因为: 同LR

综上: 新插入的节点必在node右子树的左边。


3
1
mrglint
思维缜密,厉害
2020-02-24
共1条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程