Magasság kiszámítása egy fa

szavazat
3

Próbálom a magasság kiszámítása egy fa. Én doint a kódot írt alább.

#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);*/

}

Ez ad nekem CORRET eredményt. De néhány hozzászólás (googled oldal) Azt javasolták, hogy az időt a postorder bejárás és ezt a magasságot számítási módjára magasság. Bármely konkrét oka?

A kérdést 17/02/2010 09:07
a forrás felhasználó
Más nyelveken...                            


5 válasz

szavazat
2

A fa magasságát nem változik a bejárás. Ez állandó marad. Ez a sorozat a csomópontok, amelyek változnak attól függően, hogy a bejárás.

Válaszolt 17/02/2010 09:17
a forrás felhasználó

szavazat
14

De nem postorder bejárás pontosan, hogy mit csinálsz? Feltételezve, balra és jobbra egyaránt nem null, akkor először ezt height(left), majd height(right), majd néhány feldolgozás a jelenlegi csomópontot. Ez postorder bejárás szerinti rám.

De azt írja, mint ez:

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

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

Edit: attól függően, hogy hogyan határozzák meg a fa magassága, alapeset (egy üres fa) legyen 0 vagy -1.

Válaszolt 17/02/2010 09:19
a forrás felhasználó

szavazat
2

Meghatározásokat wikipedia .

Előrendelés (mélységi):

  1. Látogasson el a gyökér.
  2. Áthalad a bal részfa.
  3. Traverse a jobb részfa.

Inorder (szimmetrikus):

  1. Áthalad a bal részfa.
  2. Látogasson el a gyökér.
  3. Traverse a jobb részfa.

postorder:

  1. Áthalad a bal részfa.
  2. Traverse a jobb részfa.
  3. Látogasson el a gyökér.

„Látogatás” a definíciók azt jelenti: „a magasság kiszámítása a node”. Melyik az Ön esetében az vagy nulla (bal és jobb null), vagy 1 + együttes magassága gyerekek.

A megvalósításban, a bejárási sorrend nem számít, akkor ugyanazt az eredményt adja. Cant tudom megmondani mást, mint hogy nem egy linket a forrás arról postorder hogy szívesebben.

Válaszolt 17/02/2010 09:27
a forrás felhasználó

szavazat
4

A kód nem a fák, ahol legalább az egyik csomópont csak egy gyerek:

// 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);
//...

Ha a fa két csomópont (a gyökér és vagy a bal vagy a jobb gyerek) hívja a módszer a root nem teljesíti az első feltétel (legalább az egyik részfák nem üres), és akkor hívja rekurzívan mindkét gyerek. Egyikük null, de még akkor dereference a null pointer elvégzésére if.

A helyes megoldás az, küldte Hans itt. Mindenesetre meg kell választani, mi a módszer invariáns van: vagy hívásokat lehetővé tevő, ahol az argumentum null és kezelni, hogy elegánsan, vagy mást igényel az az érv, hogy nem lehet nulla, és garantálja, hogy ne hívja a módszer null mutató .

Az első esetben biztonságosabb, ha nem ellenőrzik az összes belépési pont (az eljárás nyilvános, mint a kódban), mivel nem tudja garantálni, hogy a külső kód nem engedi null mutató. A második megoldás (változó az aláírás referencia, és így tagja eljárás az treeosztály) lehet tisztább (vagy nem), ha vezérelheti az összes belépési pont.

Válaszolt 17/02/2010 09:40
a forrás felhasználó

szavazat
0

Itt van válasz:

int Help :: heightTree (node *nodeptr)
{
    if (!nodeptr)
        return 0;
    else
    {
        return 1 + max (heightTree (nodeptr->left), heightTree (nodeptr->right));
    }
}
Válaszolt 18/02/2015 20:02
a forrás felhasználó

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