Vypočítat výšku stromu

hlasů
3

Snažím se vypočítat výšku stromu. Jsem doint s kód napsaný níže.

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

}

To mi dává corret výsledek. Ale v některých pracovních míst (googled strana) Bylo navrženo, aby to udělat postorder traversal a použít tuto výšku metodu pro výpočet výšky. Nějaký konkrétní důvod?

Položena 17/02/2010 v 09:07
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
2

Výška stromu nemění se průchod. To zůstává konstantní. To je posloupnost uzlů, které se mění v závislosti na průchod.

Odpovězeno 17/02/2010 v 09:17
zdroj uživatelem

hlasů
14

Ale není postorder průchod přesně to, co děláte? Za předpokladu, že vlevo a vpravo jsou oba non-null, nejprve udělat height(left), a pak height(right), a pak nějaké zpracování v aktuálním uzlu. To postorder průchod podle mě.

Ale já bych napsat to takhle:

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

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

Edit: V závislosti na tom, jak definujete výšku stromu, základní případ (u prázdného stromu) by měla být 0 nebo -1.

Odpovězeno 17/02/2010 v 09:19
zdroj uživatelem

hlasů
2

Definice z Wikipedie .

Preorder (hloubky):

  1. Navštivte kořen.
  2. Procházet levý podstrom.
  3. Traverse pravém podstromu.

Nezbytného (symetrické):

  1. Procházet levý podstrom.
  2. Navštivte kořen.
  3. Traverse pravém podstromu.

postorder:

  1. Procházet levý podstrom.
  2. Traverse pravém podstromu.
  3. Navštivte kořen.

„Návštěva“ v definicích znamená „výpočet výšky uzlu“. Což ve vašem případě je buď nula (oba vlevo a vpravo jsou null) nebo 1 + kombinovaná výška dětí.

V implementaci pořadí traversal nevadí, že by poskytlo stejné výsledky. Převýšení vám opravdu říct něco víc než to bez odkazu na zdroj uvádí postorder má přednost.

Odpovězeno 17/02/2010 v 09:27
zdroj uživatelem

hlasů
4

Tento kód se nezdaří v korunách stromů, kde alespoň jeden z uzlů má jen jedno dítě:

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

V případě, že strom má dva uzly (kořen a buď levé nebo pravé dítě) volání metody v kořenovém adresáři nebude splnění první podmínky (alespoň jeden z podstromů je non-prázdná) a bude volat rekurzivně na obě děti. Jedním z nich je null, ale stále to bude dereference ukazatele null k provedení if.

Správné řešení je jednou odeslal Hans zde. V každém případě je třeba zvolit, jaké jsou vaše metoda invariants jsou: buď povolit volání, kde tento argument je nulový a řešíte, které elegantně jinak budete potřebovat argument být nenulová a záruka, že nemáte volání metody s ukazateli null ,

Prvním případem je bezpečnější, pokud nechcete řídit všechny vstupní body (Tato metoda je veřejnost v kódu), protože není možné zaručit, že externí kód neprojde ukazatele null. Druhé řešení (změna podpis k odkazu, a dělat to způsob členem treeskupiny) by mohl být čistší (nebo ne), pokud můžete ovládat všechny vstupní body.

Odpovězeno 17/02/2010 v 09:40
zdroj uživatelem

hlasů
0

Zde je odpověď:

int Help :: heightTree (node *nodeptr)
{
    if (!nodeptr)
        return 0;
    else
    {
        return 1 + max (heightTree (nodeptr->left), heightTree (nodeptr->right));
    }
}
Odpovězeno 18/02/2015 v 20:02
zdroj uživatelem

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