rr型平衡化旋轉
lr型平衡化旋轉
rl型平衡化旋轉
特殊的平衡化旋轉
總結
刪除節點後下面的子樹是保持不變的所有肯定不會失衡,可能失衡的點是在根到刪除節點這條路徑上的點[t,a)。
從刪除點向上回溯,並不斷更新路上節點的高度。若失衡我們就進行旋轉調整,直到乙個高度不變並且保持平衡的點結束,或者到根節點。
#include
using
namespace std;
struct node
;int
get_height
(node *t)
intget_bfactor
(node *t)
node *
ll_rotate
(node *t)
node *
rr_rotate
(node *t)
node *
lr_rotate
(node *t)
node *
rl_rotate
(node *t)
//flag用於標誌
node *
insert_new
(node *t,
int x,
int&flag)
int b_factor=
get_bfactor
(t);
//當前節點沒原來的平衡因子
if(t-
>val==x)
//已存在
flag=0;
else
if(t-
>val>x)
t->lchild=
insert_new
(t->lchild, x,flag)
;else
t->rchild=
insert_new
(t->rchild, x,flag);if
(flag==1)
if(get_bfactor
(t)==-2
)//右子樹失衡}}
return t;
}//flag用於標誌
node *
delete
(node *t,
int key,
bool
&flag)
//找到結點,將它刪除
if(key == t-
>val)
else}}
//在左子樹中遞迴刪除
if(key < t-
>val)
t->lchild=
delete
(t->lchild, key,flag)
;else
t->rchild=
delete
(t->rchild, key,flag)
;//刪除成功,更新路徑上的點
if(flag)if(
get_bfactor
(t)==2)
//l}
return t;
}void
dfs(node *p)
}int
main()
dfs(root_new)
; cout<<
"++++++++++++++++++++++++++++++"
false
; root_new=
delete
(root_new,
70,flag1)
;dfs
(root_new)
; cout<<
"*************************=="
false
; root_new=
delete
(root_new,
9,flag1)
;dfs
(root_new)
; cout<<
"*************************=="
<950 20 10 60 70 30 9 12 15
*/
平衡二叉樹例題 平衡二叉樹
acwing 72.平衡二叉樹 思路一 求每個節點的左右子樹深度,根據深度差判斷,直到葉子節點結束,效率不夠高,每個節點都要用兩次計算深度的遞迴函式 思路二 從葉子節點開始,計算深度差,一旦有深度差大於1的,就直接返回0,也不用管上面的深度是不是正確了,畢竟我們只需要true和false兩種狀態,省...
二叉樹 平衡二叉樹
1.題目 給定乙個二叉樹,判斷這棵二叉樹是否是高度平衡的二叉樹 平衡二叉樹 乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1 2.題目分析 1 如果乙個節點的兩個子樹的深度之差超過1,則不是平衡二叉樹 2 如果乙個節點的兩個子樹的深度之差不超過1,則是平衡二叉樹 3.程式分析 1 若這棵二...
平衡二叉樹
平衡二叉樹 time limit 1000 ms memory limit 32768 kb submit 16 6 users accepted 6 6 users 所謂平衡 二叉樹就是 水星文,若看不懂請跳轉到下一題 你的任務判斷輸入的二叉樹是否為平衡二叉樹,是則輸出yes,否則輸出no。每行是...