如果給定的鍵key小於二叉查詢樹的根節點的鍵,那麼小於等於key的最大鍵floor(key)一定在根節點的左子樹中;如果給定的鍵key大於二叉查詢樹的根節點,那麼只有當根節點右子樹中存在小於等於key的節點時,小於等於key的最大鍵才會出現在右子樹中,否則根節點就是小於等於key的最大鍵。
/*在以node為根節點的樹中查詢小於等於key的最大鍵(向下取整)*/
node floor(node x,key key)
注意書中的rank()和select()演算法也是用類似思想實現的遞迴。
/**
* 如果左子樹的結點數大於k,則遞迴地在左子樹中查詢排名為k的鍵; 如果t等於k,在返回根結點的鍵;
* 如果t小於k,遞迴地在右子樹中查詢排名為(k-t-1)的鍵
* * @param x
* @param k
* @return
*/private node select(node x, int k)
int t = size(x.left);
if (t > k) else if (t < k) else
} // 根據鍵返回下下標(排名)
public int rank(key key)
/*** 如果給定的鍵和根結點的鍵相等,返回根節點左子樹的結點總數t size(x.left); 如果給定的鍵比根結點的鍵小,遞迴計算在做子樹的排名;
* 如果給定的鍵比根結點的鍵大,返回根結點左子樹結點總數t+1+它在右子樹的排名
* * @param x
* @param key
* @return
*/private int rank(node x, key key)
int cmp = key.compareto(x.key);
if (cmp < 0) else if (cmp > 0) else
}
二叉查詢樹中的遞迴的子問題一般是左子樹和右子樹。
而根節點用來作為劃分的標準。
要注意判斷樹空,結束遞迴呼叫。
《演算法》 第三章 查詢
在第三章裡面,並不是一開始就講的查詢,第一節中首先介紹的是符號表。符號表,其實就是儲存了鍵值對的一種資料結構,鍵值對用於將乙個鍵和乙個值聯絡起來。符號表支援兩種操作 插入 put 即將一組新的鍵值對存入表中 查詢 get 即根據給定的鍵得到對應的值。下面看一下書中關於符號表的應用以及api 書中對於...
第三章 3 3平衡二叉樹
在本節中,我們會介紹一種二分查詢樹並能保證無論如何構造它,它的執行時間都是對數級別的。在理想情況下,我們希望能保持二分查詢樹的平衡性。在一棵含有n個結點的樹中,我們希望樹的高位 lgn,這樣我們能保證所有查詢都能在 lgn次比較內結束,就像二分查詢一樣。3.3.1 2 3 查詢樹 定義 一棵2 3 ...
第三章 二分查詢
今天要學習的是二分查詢。1.介紹 二分查詢跟歸併與快排一樣都採用了分治思想,它是在乙個有序陣列中查詢資料。2.方法 將乙個陣列的下標除以2,得到的是中間數,中間數與要查詢的資料進行對比 注意這裡是有序陣列 如果要查詢的資料比中間數大就在中間數的右邊,如果小就在左邊。一直迴圈,直到找到要查詢的資料或者...