एक पेड़ की ऊंचाई की गणना करें

वोट
3

मैं एक पेड़ की ऊंचाई की गणना करने की कोशिश कर रहा हूँ। मैं नीचे लिखे कोड के साथ doint कर रहा हूँ।

#include<iostream.h>

struct tree
{
    int data;
    struct tree * left;
    struct tree * right;
};

typedef struct tree tree;

class Tree
{
private:
    int n;
    int data;
    int l,r;
public:
    tree * Root;
    Tree(int x)
    {
        n=x;
        l=0;
        r=0;
        Root=NULL;
    }
    void create();
    int height(tree * Height);

};

void Tree::create()
{
    //Creting the tree structure
} 

int Tree::height(tree * Height)
{
    if(Height->left==NULL && Height->right==NULL)
    {return 0;
    }
    else
    {
        l=height(Height->left);
        r=height(Height->right);

        if (l>r)
        {l=l+1;
        return l;
        }
        else
        {
            r=r+1;
            return r;
        }
    }
}

int main()
{
    Tree A(10);//Initializing 10 node Tree object
    A.create();//Creating a 10 node tree

    cout<<The height of tree<<A.height(A.Root);*/

}

यह मेरे corret परिणाम देता है। लेकिन में कुछ पदों (googled पेज) यह एक क्रंमोत्तर चंक्रमण करो और ऊंचाई की गणना करने के लिए इस ऊंचाई विधि का उपयोग करने का सुझाव दिया गया था। कोई विशेष कारण?

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


5 जवाब

वोट
2

पेड़ की ऊंचाई ट्रेवर्सल साथ नहीं बदलता है। यह लगातार बनी हुई है। यह नोड्स ट्रेवर्सल के आधार पर बदल के अनुक्रम है।

17/02/2010 को 09:17
का स्रोत उपयोगकर्ता

वोट
14

लेकिन एक क्रंमोत्तर चंक्रमण ठीक तुम क्या कर रहे हो? बाईं मान लिया जाये और सही दोनों गैर-शून्य, आप पहली बार कर रहे हैं height(left), तो height(right)वर्तमान नोड में कुछ प्रसंस्करण, और उसके बाद। यही कारण है कि मेरे हिसाब से क्रंमोत्तर चंक्रमण है।

लेकिन मैं इसे इस तरह लिखना होगा:

int Tree::height(tree *node) {
    if (!node) return -1;

    return 1 + max(height(node->left), height(node->right));
}

संपादित करें: आप वृक्ष की ऊंचाई कैसे परिभाषित पर निर्भर करता है, आधार मामले (एक खाली पेड़ के लिए) 0 या -1 चाहिए।

17/02/2010 को 09:19
का स्रोत उपयोगकर्ता

वोट
2

से परिभाषाएं विकिपीडिया

Preorder (गहराई-प्रथम):

  1. जड़ पर जाएँ।
  2. छोड़ दिया सबट्री बढ़ावा देते हैं।
  3. सही सबट्री पार।

Inorder (सममित):

  1. छोड़ दिया सबट्री बढ़ावा देते हैं।
  2. जड़ पर जाएँ।
  3. सही सबट्री पार।

पोस्ट ऑर्डर:

  1. छोड़ दिया सबट्री बढ़ावा देते हैं।
  2. सही सबट्री पार।
  3. जड़ पर जाएँ।

"यात्रा" परिभाषा में "नोड की ऊंचाई की गणना" का अर्थ है। आपके मामले में जो या तो शून्य (दोनों को छोड़ दिया और सही कह रहे हैं नल) या 1 + बच्चों के संयुक्त ऊंचाई है।

अपने कार्यान्वयन में, ट्रेवर्सल क्रम आवश्यक नहीं है, यह एक ही परिणाम देना होगा। नहीं कर सकते वास्तव में बताते हुए क्रंमोत्तर पसंद करते हैं करने के लिए है अपने स्रोत का लिंक के बिना उसके अलावा कुछ भी अधिक आपको बता।

17/02/2010 को 09:27
का स्रोत उपयोगकर्ता

वोट
4

कोड पेड़ों में असफल हो जायेगी जहां नोड्स के कम से कम एक केवल एक ही बच्चा है:

// code snippet (space condensed for brevity)
int Tree::height(tree * Height) {
    if(Height->left==NULL && Height->right==NULL) { return 0; }
    else {
        l=height(Height->left);
        r=height(Height->right);
//...

पेड़ दो नोड्स (रूट और या तो एक बाईं या दाईं बच्चे) जड़ पर विधि बुला पहली शर्त को पूरा नहीं होगा नहीं हैं (subtrees कम से कम एक गैर खाली है) और यह दोनों बच्चों पर पुनरावर्ती कॉल करेंगे। उनमें से एक रिक्त है, लेकिन अभी भी यह शून्य संकेतक भिन्नता प्रदर्शन करने के लिए होगा if

एक सही समाधान एक द्वारा पोस्ट की गई है हंस यहाँ। किसी भी हाल में आपके द्वारा चुने गए है कि आपके विधि अपरिवर्तनशीलताओं कर रहे हैं: या तो आप कॉल जहां तर्क रिक्त है की अनुमति देते हैं और आप को संभाल कि शान से वरना आप तर्क की आवश्यकता होती है में गैर-शून्य और गारंटी है कि आप अशक्त संकेत के साथ विधि कॉल नहीं है होना करने के लिए ।

पहले मामले में सुरक्षित है, तो आप सभी प्रवेश बिंदुओं (विधि अपने कोड में के रूप में जनता है) के बाद से आप गारंटी नहीं दे सकते कि बाहरी कोड अशक्त संकेत पारित नहीं होगा नियंत्रण नहीं है। दूसरा समाधान (संदर्भ के लिए हस्ताक्षर बदल रहा है, और यह के एक सदस्य विधि बनाने treeयदि आप सभी प्रवेश द्वारों को नियंत्रित कर सकते वर्ग) क्लीनर (या नहीं) हो सकता है।

17/02/2010 को 09:40
का स्रोत उपयोगकर्ता

वोट
0

यहाँ जवाब है:

int Help :: heightTree (node *nodeptr)
{
    if (!nodeptr)
        return 0;
    else
    {
        return 1 + max (heightTree (nodeptr->left), heightTree (nodeptr->right));
    }
}
18/02/2015 को 20:02
का स्रोत उपयोगकर्ता

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