कैसे एक AVL पेड़ में एक नोड के पद को खोजने के लिए?

वोट
4

मैं दो पद प्रश्नों [लागू करने की आवश्यकता rank(k)है और select(r)]। लेकिन इससे पहले कि मैं इस पर शुरू कर सकते हैं, मैं कैसे दो कार्यों काम यह पता लगाने की जरूरत है।

जहाँ तक मुझे पता है, rank(k)किसी खास कुंजी की रैंक देता है k, और select(r)किसी दिए गए पद के प्रमुख रिटर्न r

तो मेरी सवाल कर रहे हैं:

1.) कैसे आप एक AVL (आत्म संतुलन BST में एक नोड के पद) की गणना करते हैं?

2.) यह एक से अधिक कुंजी एक ही रैंक के लिए के लिए संभव है? और अगर ऐसा है, तो क्या woulud select(r)वापसी?

मैं एक नमूना AVL पेड़ है जो आप अगर यह सवाल का जवाब में मदद करता है का उल्लेख कर सकते शामिल करने के लिए जा रहा हूँ।

यहाँ

धन्यवाद!

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


4 जवाब

वोट
3

आपका प्रश्न वास्तव में करने पर निर्भर करता: "कैसे 'शब्द का पद' सामान्य रूप से एक AVL पेड़ के संबंध में परिभाषित किया गया है?" (और संभवतः कैसे है 'का चयन करें' सामान्य रूप से के रूप में अच्छी तरह से परिभाषित)।

यानी, कितने नोड्स, उसके बाईं ओर कर रहे हैं - कम से कम के रूप में मैं शब्द का इस्तेमाल किया देखा है, "रैंक" पेड़ में नोड्स के बीच स्थिति का मतलब है। आप आमतौर पर एक नोड (या शायद एक महत्वपूर्ण मूल्य) के लिए सूचक दिया जाता है और आप अपनी बाईं ओर नोड्स की संख्या की गणना करने की जरूरत है।

"चुनें" मूल रूप से विपरीत है - आप एक निश्चित रैंक दिया जाता है, और निर्दिष्ट नोड के लिए एक सूचक (या उस नोड के लिए कुंजी) को पुनः प्राप्त करने की जरूरत है।

दो टिप्पणियां: सबसे पहले, इन संशोधित पेड़ बिल्कुल न के बाद से, यह कोई वास्तविक अंतर का संतुलन बनाने के किस रूप में प्रयोग किया जाता है (जैसे, AVL बनाम लाल / काले) बनाता है; उस बात के लिए सब पर कोई संतुलन के साथ एक पेड़ के रूप में अच्छी तरह से बराबर है। दूसरा, अगर आप इस अक्सर क्या करने की जरूरत है, तो आप गति काफी प्रत्येक नोड रिकॉर्डिंग कितने नोड्स अपनी बाईं ओर हैं के लिए एक अतिरिक्त क्षेत्र जोड़कर सुधार कर सकते हैं।

28/02/2011 को 04:07
का स्रोत उपयोगकर्ता

वोट
1

रैंक वाम उप पेड़ प्लस वन में नोड्स की संख्या है, और हर नोड के लिए गणना की जाती है। मेरा मानना ​​है कि रैंक एक अवधारणा AVL पेड़ के लिए विशिष्ट नहीं है - यह किसी भी द्विआधारी पेड़ के लिए गणना की जा सकती।

चयन सिर्फ रैंक करने के लिए विपरीत है। एक रैंक दिया जाता है और आप एक नोड मिलान कि रैंक वापस लौटाना होगा।

निम्नलिखित कोड रैंक गणना प्रदर्शन करेंगे:

void InitRank(struct TreeNode *Node)
{
        if(!Node)
        {
                return;
        }
        else
        {       Node->rank = 1 + NumeberofNodeInTree(Node->LChild);
                InitRank(Node->LChild);
                InitRank(Node->RChild);
        }

}


int NumeberofNodeInTree(struct TreeNode *Node)
{
        if(!Node)
        {
                return 0;
        }
        else
        {
                  return(1+NumeberofNodeInTree(Node->LChild)+NumeberofNodeInTree(Node->RChild));
        }
}
30/08/2013 को 10:13
का स्रोत उपयोगकर्ता

वोट
0

यहाँ कोड मैं लिखा था और ठीक से काम किया AVL ट्री एक विशेष मान की रैंक पाने के लिए है। अंतर केवल आपके पैरामीटर के रूप में एक नोड प्रयोग किया जाता है और मैं एक महत्वपूर्ण एक पैरामीटर का उपयोग किया। आप अपने खुद के तरीके के रूप में इस संशोधित कर सकते हैं। नमूना कोड:

    public int rank(int data){
    return rank(data,root);
}

private int rank(int data, AVLNode r){
    int rank=1;
    while(r != null){
        if(data<r.data)
            r = r.left;
        else if(data > r.data){
            rank += 1+ countNodes(r.left);
            r = r.right;
        }
        else{
            r.rank=rank+countNodes(r.left);
            return r.rank;
        }
    }
    return 0;
}

[एनबी] क्या आप तो चर रैंक प्रारंभ = 0 0 से अपनी रैंक प्रारंभ करना चाहते हैं। आप निश्चित रूप से विधि countNodes () इस कोड को निष्पादित करने के लिए लागू किया जाना चाहिए था।

08/09/2015 को 20:14
का स्रोत उपयोगकर्ता

वोट
-1

यहाँ मैं क्या किया है है। मेरे कार्यक्रम में एक तत्व के पद 1+ (उस तत्व से अधिक तत्वों का कोई) के रूप में परिभाषित किया गया है। आप यहाँ नोट कर सकते हैं कि तत्व पेड़ में मौजूद नहीं है।

एल्गोरिथ्म रैंक को खोजने के लिए:

वृक्ष संरचना 1.In जड़ सहित एक उप पेड़ में तत्वों का कोई पर नज़र रखें। तो पेड़ इच्छा के सिर पेड़ में कुल तत्व शामिल हैं।

एक नोड के साथ तत्व 2.Compare, अगर यह नोड से छोटी है, तो (1 + संख्या सही बच्चे में तत्वों) तत्वों से अधिक कुंजी की कुल करने के लिए इसे element.Add कर रहे हैं और रिकर्सिवली में तत्व खोज बाईं बच्चे।

3. यदि तत्व रूट नोड से अधिक होता है तो बस रिकर्सिवली तत्व खोज सही बच्चे में। (कुछ भी जोड़ने की आवश्यकता के बाद से हम छोड़ दिया पेड़ की उपेक्षा कर रहे हैं, जिसमें सभी तत्वों को किसी कुंजी की तुलना में कम कर रहे हैं)

algo 4.Terminate जब आप पाते हैं तत्व अशक्त में पहुँच रहे हैं।

दिए गए कार्यक्रम को देखते हुए प्रमुख से अधिक तत्वों का कोई देता है। 1 + दिए गए मान रैंक है।

सांकेतिक टुकड़ा:

int AVLUtils::rank(Node *root,long long val)
  {
    int n_ele_greater=0;
    int rank =0;

    if(root == NULL)
    return 0;
   if(val < root->key)
     {
    n_ele_greater = 1+this->n_elements(root->right_child)+this->rank(root->left_child,val);
     }
   else if(val > root->key)
     {
    n_ele_greater=this->rank(root->right_child,val);
    }

    else if(val == root->key)
    {
    return(this->n_elements(root->right_child));
    }
    return(n_ele_greater);
   }

उम्मीद है की यह मदद करेगा :)

03/10/2015 को 16:52
का स्रोत उपयोगकर्ता

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