Υπολογίστε το ύψος ενός δέντρου

ψήφοι
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 αποτέλεσμα. Αλλά σε ορισμένες θέσεις (στο google σελίδα) Προτάθηκε να κάνει μια διάσχιση Postorder και χρησιμοποιούν αυτή τη μέθοδο ύψος για τον υπολογισμό του ύψους. Κάθε συγκεκριμένος λόγος;

Δημοσιεύθηκε 17/02/2010 στις 09:07
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
2

Το ύψος του δέντρου δεν αλλάζει με τη διάσχιση. Παραμένει σταθερή. Είναι η ακολουθία των κόμβων που αλλάζουν ανάλογα με την διάσχιση.

Απαντήθηκε 17/02/2010 στις 09:17
πηγή χρήστη

ψήφοι
14

Αλλά δεν είναι μια διάσχιση postorder ακριβώς τι κάνετε; Υποθέτοντας αριστερά και δεξιά είναι τόσο μη-μηδενική, θα πρέπει πρώτα να κάνετε height(left), τότε height(right), και στη συνέχεια κάποια επεξεργασία στο τρέχον κόμβο. Αυτό είναι postorder διάσχιση σύμφωνα με μένα.

Αλλά θα ήθελα να το γράψω όπως αυτό:

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

Ορισμοί από την wikipedia .

Προπαραγγελία (βάθος-πρώτα):

  1. Επισκεφθείτε τη ρίζα.
  2. Διασχίζουν το αριστερό υποδένδρο.
  3. Traverse το δικαίωμα υποδέντρο.

Inorder (συμμετρικό):

  1. Διασχίζουν το αριστερό υποδένδρο.
  2. Επισκεφθείτε τη ρίζα.
  3. Traverse το δικαίωμα υποδέντρο.

Postorder:

  1. Διασχίζουν το αριστερό υποδένδρο.
  2. Traverse το δικαίωμα υποδέντρο.
  3. Επισκεφθείτε τη ρίζα.

«Επίσκεψη» στους ορισμούς σημαίνει «υπολογίσει το ύψος του κόμβου». Ποιες στην περίπτωσή σας είναι είτε μηδέν (και τα δύο αριστερά και δεξιά είναι μηδέν) ή 1 + συνδυασμένο ύψος των παιδιών.

Στην εφαρμογή σας, η σειρά διάσχισης δεν πειράζει, θα δώσει τα ίδια αποτελέσματα. Cant πραγματικά να σας πω τίποτα περισσότερο από αυτό χωρίς σύνδεση με την πηγή σας η οποία postorder είναι να προτιμούν.

Απαντήθηκε 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);
//...

Αν το δέντρο έχει δύο κόμβους (η ρίζα και είτε αριστερά είτε δεξιά παιδί) καλώντας τη μέθοδο στη ρίζα δεν θα πληρούν την πρώτη προϋπόθεση (τουλάχιστον ένα από τα υποδένδρων είναι μη κενό) και θα καλέσει κατ 'επανάληψη στις δύο παιδιών. Ένας από αυτούς είναι μηδενική, αλλά και πάλι θα dereference το κενό δείκτη να εκτελέσει το if.

Η σωστή λύση είναι αυτή που δημοσιεύτηκε από τον Hans εδώ. Σε κάθε περίπτωση θα πρέπει να επιλέξετε ποια μέθοδο αναλλοίωτες σας: είτε θα επιτρέπει την πραγματοποίηση κλήσεων όταν το επιχείρημα είναι άκυρη και θα χειριστεί ότι χάρη ή αλλιώς να σας ζητήσει το επιχείρημα ότι δεν είναι άκυρη και εγγύηση ότι δεν καλέσετε τη μέθοδο με μηδενική δείκτες .

Η πρώτη περίπτωση είναι πιο ασφαλείς αν δεν ελέγχουν όλα τα σημεία εισόδου (η μέθοδος είναι κοινό στον κώδικά σας) από τη στιγμή που δεν μπορεί να εγγυηθεί ότι οι εξωτερικές κώδικας δεν θα περάσει null δείκτες. Η δεύτερη λύση (αλλάζοντας την υπογραφή για την αναφορά, και καθιστώντας το μια μέθοδος μέλος της 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