1. 程式人生 > >二叉搜索樹的順序性

二叉搜索樹的順序性

-s 鍵值 發生 logs 結果 依然 得到 能夠 src

------------------siwuxie095

二叉搜索樹的順序性

二叉搜索樹具有一定的順序性,即 使用二叉搜索樹可以回答很多

元素之間的和順序相關的問題,如下:

1minimummaximum

通過二叉搜索樹可以非常容易地找到一組數據中最小的元素 minimum

和最大的元素 maximum

(2)predecessor successor

通過二叉搜索樹可以非常容易地找到一個元素的前驅 predecessor

和後繼 successor

(3)floorceil

通過二叉搜索樹還可以找到一個元素的 floor 相應的值

和 ceil 相應的值

floor 和 ceil 與 predecessor 和 successor 的最大的一個區別就是:

要想找到一個元素的前驅和後繼,首先要保證這個元素真的存在

如果要找一個元素的 floor 和 ceil:

1)如果該元素存在,那麽該元素的 floor 和 ceil 就是該元素本身

2)如果該元素不存在,那麽該元素的 floor 和 ceil 也是存在的,

分別是最後一個比該元素小的值和第一個比該元素大的值,即

接近的兩個值。當然,也有可能該元素並沒有 floor 或 ceil

(4)rank select

通過二叉搜索樹還可以找到一個元素的排名 rank

和找到某排名(如:第 100 名)的元素 select

但遺憾的是一般的二叉搜索樹並不能回答這兩個問題,可做如下改動:

對二叉搜索樹的每一個節點多添加一個屬性(域),該屬性用於存儲

以當前節點為根的二叉搜索樹一共有幾個節點

技術分享

之後就可以利用二叉搜索樹的性質:每個節點的鍵值都大於左孩子

每個節點的鍵值都小於右孩子,來實現

rank 和 select

註意:在給節點 Node 添加新屬性後,編寫 rank 和 select 這兩個

函數並不難,難的是要在之前實現的 insert 和 remove 這兩個函數

中同時維護新屬性,使得當用戶調用 rank 和 select 這兩個函數時,

能夠得到正確的結果

另外:

一般的二叉搜索樹,是不支持整棵樹中存在重復元素的,但在

有些情況下,需要二叉搜索樹支持重復元素,該怎麽做呢?

一個最簡單的方法,就是直接讓這棵樹可以存在重復元素,即

把一個節點的左孩子,定義成是小於等於這個節點的元素,右

孩子是大於這個節點的元素

不過當存在大量重復元素時,這樣做不夠節省空間

為此,依然可以通過更改節點 Node 的結構來解決,具體如下:

對二叉搜索樹的每一個節點多添加一個屬性 count,該屬性用於存儲

當前節點所代表的元素在二叉搜索樹中的個數

技術分享

此時,構建出這樣一棵二叉搜索樹很容易,不過當每個節點都多出一個

count 屬性後,相應的 insert 和 remove,以及 rank 和 select 等等都

要發生改變,以維護 count 屬性

【made by siwuxie095】

二叉搜索樹的順序性