आप subtrees में से प्रत्येक के आकार है, तो यह (या पेड़ traversing अन्यथा) एक सरणी में डेटा को पढ़ने के लिए होने और तक की गिनती के बिना संभव हो सकता है। आप आकार जानकारी को अपने आस नहीं रखते हैं, तो आप आकार की गणना करने के लिए एक सहायक समारोह की आवश्यकता होगी।
मूल विचार, यह पता लगाने वर्तमान नोड के सूचकांक है क्या। यदि यह कश्मीर की तुलना में कम है, तो आप छोड़ दिया सबट्री खोज करने के लिए की जरूरत है। यदि यह कश्मीर से अधिक है, नोड्स छोड़ दिया और वर्तमान से गिना offsetting सही खोज करते हैं। ध्यान दें कि यह अनिवार्य रूप से इस समय हम सूचकांक, नहीं डेटा से खोज कर रहे हैं, सिवाय एक नियमित BST के माध्यम से खोज, के रूप में एक ही है। कुछ स्यूडोकोड:
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
इसे समझने के लिए, चिह्नित सूचकांक के साथ इस पेड़ पर विचार (यहां तक कि डेटा के बारे में चिंता मत करो के रूप में यह खोज में महत्वपूर्ण नहीं है):
3
/ \
2 6
/ / \
0 4 7
\ \
1 5
मान लीजिए कि हमें 2 (k = 2) लगाना चाहते हैं।
3 पर प्रारंभ हो, छोड़ दिया सबट्री के आकार 3. है
यह एक से अधिक तो k बाईं सबट्री आ जाते हैं।
बाईं सबट्री के आकार 2. है
कश्मीर भी 2 है, इसलिए वर्तमान नोड 2 होना चाहिए।
मान लीजिए कि हमें 4 (k = 4) लगाना चाहते हैं।
3 पर प्रारंभ हो, छोड़ दिया सबट्री के आकार 3. है
यह एल से कम है तो 0 होने के लिए नई कश्मीर समायोजित (के '= 4 - (3 + 1)) और सही सबट्री में ले जाएँ।
6 पर प्रारंभ हो, छोड़ दिया सबट्री के आकार 2. है
यह कश्मीर से बड़ा है '(0) तो बाईं सबट्री में ले जाएँ।
बाईं सबट्री के आकार 0. है
कश्मीर 'भी 0 इसलिए वर्तमान नोड 4 होना चाहिए है।
तुम्हें नया तरीका मिल गया है।