性質
Size Balanced Tree(SBT)是一種通過大小(Size)域來保持平衡的二叉搜尋樹,它也因此得名。它總是滿足:
對於SBT的每一個結點 t:
性質(a) s[right[t] ]≥s[Left[left[t]]], s[right[left[t]]]
性質(b) s[left[t] ]≥s[right[right[t]]], s[left[right[t]]]
即每棵子樹的大小不小於其兄弟的子樹大小。
旋轉
SBT的旋轉(Rotations)與其他許多高級BST相同。它是下面提到的Maintain操作的基礎。
左旋轉Left-Rotate (t)
1 k ← right[t]
2 right[t] ← left[k]
3 left[k] ← t
4 s[k] ← s[t]
5 s[t] ← s[left[t]] + s[right[t]] + 1
6 t ← k
Right-Rotate(t)
1 k ← left[t]
2 left[t] ← right[k]
3 right[k] ← t
4 s[k] ← s[t]
5 s[t] ← s[left[t]] + s[right[t]] + 1
6 t ← k
基本操作
查找SBT的查找操作與普通BST完全相同。下面的過程將返回指向目標節點的指針。
Search(t,k)
1 if x=NIL or k=key[t]
2 then return x
3 if k<key[x]
4 then return Search(left[x],k)
5 else return Search(right[x],k)
由於SBT本身已經維護了size,因此這兩項可用Select操作完成。
後繼SBT的後繼操作與普通BST完全相同。
前趨SBT的前趨操作與普通BST完全相同。它與上面的後繼操作對稱。
插入SBT的插入操作僅僅比普通BST的多出了一個Maintain操作,以及對s的簡單維護(這在普通BST的動態順序統計操作中也是必須的)。下面這個過程將一個節點v插入SBT中。
Insert (t,v)
1 If t=0 then
2 t ← v
3 Else
4 s[t] ← s[t]+1
5 If v<key[t] then
6 Insert(left[t],v)
7 Else
8 Insert(right[t],v)
9 Maintain(t,v≥key[t])
與普通維護size域的BST刪除相同(無需Maintain)。
檢索具有給定排序的元素下面這個過程將返回一個指向以x為根的子樹中包含第i小關鍵字的節點的指針。
Select(x,i)
1 r ← size[left[x]] + 1
2 if(i=r)
3 then return x
4 else if i<r
5 then return Select(left[x],r)
6 else return Select(right[x],i-r)
SBT的rank操作與普通BST完全相同。
性能分析
SBT的高度是O(logn),Maintain是O(1),所有主要操作都是O(logn)。