Eğer alt ağaçlar her birinin boyutları, bu bir diziye veri okumak zorunda (veya başka bir ağaç geçme) ve yukarı saymadan yapılabilir olabilir. Eğer kullanışlı boyutu bilgisini tutmak yoksa, sen boyutunu hesaplamak için bir yardımcı işlevi gerekir.
Temel fikir, akım düğümün endeksidir anlamaya. o k azsa, sola alt ağacı arama yapmak gerekir. o k büyükse, sol ve akımından sayılır düğümleri mahsup hakkına arayın. Bu temelde biz endeksi değil, veri tarafından arıyorsunuz bu sefer hariç, düzenli BST üzerinden arama ile aynı olduğuna dikkat edin. Bazı yalancı kod:
if size of left subtree is equal to k:
// the current node is kth
return data of current node
else if size of left subtree is greater than k:
// the kth node is on the left
repeat on the left subtree
else if size of left subtree is less than k:
// the kth node is on the right
reduce k by the size of the left subtree + 1 // need to find the (k')th node on the right subtree
repeat on the right subtree
(Aramada önemli değil hatta veri hakkında endişelenmeyin) işaretli endeksleri ile bu ağaç ele alalım:
3
/ \
2 6
/ / \
0 4 7
\ \
1 5
Biz 2'nci (k = 2) bulmak istediğinizi varsayalım.
3'te başlayarak, sol alt ağaç boyutu 3'tür
yüzden k sol alt ağaç hareket daha büyüktür.
Sol alt ağacın büyüklüğü 2'dir
k yüzden şimdiki düğüm 2 olmalıdır da 2'dir.
Biz 4th (k = 4) bulmak istediğinizi varsayalım.
3'te başlayarak, sol alt ağaç boyutu 3'tür
O ( 'k = 4 - (3 + 1)), böylece 0 olduğu yeni k ayarlamak l'den az olan ve hemen alt ağacı hareket eder.
6 başlayarak, sol alt ağaç büyüklüğü 2'dir
Bu k'dan daha büyük olan'(0) böylece sol alt ağacı hareket eder.
Sol alt ağacın büyüklüğü 0'dır
'k 0 yüzden şimdiki düğüm 4 olmalıdır da.
Kaptın bu işi.