एक BST में kth सबसे छोटा मान ढूँढना

वोट
0

यहाँ है कि मैं क्या एक द्विआधारी खोज वृक्ष में kth सबसे छोटा मान खोजने के लिए है:

struct treeNode 
{
   int data;
   struct treeNode *left, *right:
};

int rank(stuct treeNode* ptr, int k)
{
   if(node == NULL)
    return root; 

   while(ptr->left != NULL) {
     ptr = ptr->left;
     return rank(ptr->left)
   }
}

यह स्पष्ट रूप से सही नहीं है। समाधान प्रदान के बिना, कोई मुझे यह कैसे हल कर सकते थे के रूप में सही दिशा में मेरा मार्गदर्शन कर सकता है? मैं मुसीबत पता लगाना है कि कैसे मैं एक BST में kth सबसे छोटा तत्व मिल सकता है कर रहा हूँ।

03/05/2011 को 02:17
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


3 जवाब

वोट
0

यह काम करना चाहिए:

int rank(struct treeNode* n,int k,int* chk)
    {
    if(!n) return -1;
    int _chk = 0;
    if(!chk) chk = &_chk;

    int t = rank(n->left,k,chk);
    if(t>=0) return t;

    if(++*chk > k) return n->data;

    int t = rank(n->right,k,chk);
    if(t>=0) return t;
    return -1;
    }

के रूप में फोन rank(root,k,0)

03/05/2011 को 02:35
का स्रोत उपयोगकर्ता

वोट
1

आप 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 होना चाहिए है।

तुम्हें नया तरीका मिल गया है।

03/05/2011 को 02:45
का स्रोत उपयोगकर्ता

वोट
5

एक BST एक क्रमबद्ध द्विआधारी पेड़, एक में आदेश ट्रावर्सल (बाएं सबट्री, वर्तमान नोड, सही सबट्री) क्रमबद्ध नोड मूल्यों दे देंगे। kth छोटी से छोटी नोड को खोजने के लिए, बस एक काउंटर के साथ एक में आदेश ट्रावर्सल है। काउंटर, 0 से शुरू होता है, जब भी एक नोड चल रहा है, यह एक के बाद बढ़ाने के लिए, जब यह कश्मीर में पहुँचता है, नोड kth छोटी से छोटी से एक है।

03/05/2011 को 02:47
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more