二叉搜索樹的順序性
------------------siwuxie095
二叉搜索樹的順序性
二叉搜索樹具有一定的順序性,即 使用二叉搜索樹可以回答很多
元素之間的和順序相關的問題,如下:
(1)minimum 和 maximum
通過二叉搜索樹可以非常容易地找到一組數據中最小的元素 minimum
和最大的元素 maximum
(2)predecessor 和 successor
通過二叉搜索樹可以非常容易地找到一個元素的前驅 predecessor
和後繼 successor
(3)floor 和 ceil
通過二叉搜索樹還可以找到一個元素的 floor 相應的值
和 ceil 相應的值
floor 和 ceil 與 predecessor 和 successor 的最大的一個區別就是:
要想找到一個元素的前驅和後繼,首先要保證這個元素真的存在
如果要找一個元素的 floor 和 ceil:
1)如果該元素存在,那麽該元素的 floor 和 ceil 就是該元素本身
2)如果該元素不存在,那麽該元素的 floor 和 ceil 也是存在的,
分別是最後一個比該元素小的值和第一個比該元素大的值,即
接近的兩個值。當然,也有可能該元素並沒有 floor 或 ceil
(4)rank 和 select
通過二叉搜索樹還可以找到一個元素的排名 rank
和找到某排名(如:第 100 名)的元素 select
但遺憾的是一般的二叉搜索樹並不能回答這兩個問題,可做如下改動:
對二叉搜索樹的每一個節點多添加一個屬性(域),該屬性用於存儲
以當前節點為根的二叉搜索樹一共有幾個節點
之後就可以利用二叉搜索樹的性質:每個節點的鍵值都大於左孩子
和
每個節點的鍵值都小於右孩子,來實現
註意:在給節點 Node 添加新屬性後,編寫 rank 和 select 這兩個
函數並不難,難的是要在之前實現的 insert 和 remove 這兩個函數
中同時維護新屬性,使得當用戶調用 rank 和 select 這兩個函數時,
能夠得到正確的結果
另外:
一般的二叉搜索樹,是不支持整棵樹中存在重復元素的,但在
有些情況下,需要二叉搜索樹支持重復元素,該怎麽做呢?
一個最簡單的方法,就是直接讓這棵樹可以存在重復元素,即
把一個節點的左孩子,定義成是小於等於這個節點的元素,右
孩子是大於這個節點的元素
不過當存在大量重復元素時,這樣做不夠節省空間
為此,依然可以通過更改節點 Node 的結構來解決,具體如下:
對二叉搜索樹的每一個節點多添加一個屬性 count,該屬性用於存儲
當前節點所代表的元素在二叉搜索樹中的個數
此時,構建出這樣一棵二叉搜索樹很容易,不過當每個節點都多出一個
count 屬性後,相應的 insert 和 remove,以及 rank 和 select 等等都
要發生改變,以維護 count 屬性
【made by siwuxie095】
二叉搜索樹的順序性