Binární stromy - trasování prostřednictvím kódu

hlasů
0

Vzhledem k tomu, binární strom je uvedeno níže, určení pořadí, ve kterém jsou navštívil uzly binárního stromu níže za předpokladu, že funkce A (root) se vyvolá. Předpokládat, že strom uzly a ukazatele jsou definovány, jak je uvedeno. Předpokládáme, že kořen je ukazatel na uzel, který obsahuje 60. Moje odpověď na tento problém je uveden níže. Je to správně? Co jsem udělal špatně?

                                   60
                                 /    \
                                30     90
                               /  \   / 
                              5   38  77
                               \  /  / \
                               8 32 62  88



struct treeNode{
  int data;
  struct treeNode *left, *right:
  {

struct treeNode *tree_ptr;

void A(struct treeNode *node_ptr){
    if (node_ptr != NULL){
    printf(“%d ,”,node_ptr->data);
    B(node_ptr->left);
    B(node_ptr->right);
   }   
}

void B(struct treeNode *node_ptr){
    if (node_ptr != NULL) {
    A(node_ptr->left);
    printf(“%d ,”,node_ptr->data);
    A(node_ptr->right);
   }
 }   

Odpověď: V void A říká, že na první tiskové node_ptr-> dat, takže 60 dostane tištěných Potom volání funkce B (node_ptr-> vlevo), pak v B, A volána (node_ptr-> vlevo) a pak vytisknout, že údaje, které jsou 5 . A pak A (node_ptr-> vpravo) volána se vrátit do A, tisku, že data, takže se vytiskne 8. Teď nejsem tak jistý, co dělat dál, ale jsem si logicky by mělo smysl pro tisk 30, ale nejsem si jistý, jak se ptr dostane od 8. do 30. A pak, pokud budete pokračovat ve stejném vzoru 38 se vytiskne a 32 se vytiskne. Pro správnou podstromu ... 90 77 62 88

Položena 14/12/2010 v 22:05
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
1

Pro začátek, váš kód má spoustu chyb v něm. Hádám, že by mělo být více jako toto:

struct treeNode{
  int data;
  struct treeNode *left, *right;
}

treeNode *tree_ptr;

void A(treeNode *node_ptr){
    if (node_ptr != NULL){  /// this could be just if(node_ptr)
        printf(“%d ,”,node_ptr->data);
        B(node_ptr->left);
        B(node_ptr->right);
    }   
}

void B(treeNode *node_ptr){
    if (node_ptr != NULL) {
        A(node_ptr->left);
        printf(“%d ,”,node_ptr->data);
        A(node_ptr->right);
    }
}   

Vy jste také smícháním dvou různých Traversal algoritmy. A()je pre-order, B()je in-pořadí. A()a B()musí být volat sebe, ne každý jiný. (Dalším důvodem pro použití reálné proměnné / názvy funkcí místo A, Ba podobně.)

Odpovězeno 14/12/2010 v 22:11
zdroj uživatelem

hlasů
1

Jen vypsat celý realizační stack v průběhu času. Takhle:

A(60)
  printf
  B(30)
    A(5)
      ...
    printf
    A(38)
      ...
  B(90)
    ...

(Zbytek stromu levého jako cvičení pro čtenáře.)

Pak stačí jít odshora až dolů, zapisoval výsledek prohlášení printf.

Odpovězeno 14/12/2010 v 22:14
zdroj uživatelem

hlasů
1

Aje pre-order průchod, přičemž Bje průchod v-pořadí.

Snadný způsob, jak zjistit pořadí tisku je podívat se na to, jak jste navštívit samotné uzly. I obvykle nakreslit obrys kolem vnější strany stromu (začíná u kořene a pohybující se vlevo nebo vpravo na základě dílčího stromu, který přechází přes první). Pokud budu dělat pre-order funkce traversal jsem vytisknout uzel, když jsem pohybovat podél jeho vnější straně . Když jsem dělá traversal na zakázku, jsem vytisknout uzel pouze tehdy, když jsem se přesunout pod ní (to dává smysl, když se podíváte na traversals na objednávku, protože můžete skončit první tisk listy, které jsou prvními uzly, které přesunete pod při kreslení osnovy). Pokud budu dělat post-objednat traversal, jsem vytisknout uzel pouze tehdy, když se pohybuji podél jeho vnitřku .

AKTUALIZACE

Důvodem 30 dostane vytiskne po 5 a 8 je, že se neprovádí čistě pre-order funkce traversal. Budete skákat mezi pre-order a průchod na zakázku.

Snadný způsob, jak zjistit pořadí je skutečně zapsat kroky váš kód prochází, jak si vystopovat přes to (I často používají pero / tužku a papír, aby tyto informace dohromady). Například byste mohli udělat vypsat call-stack, jako je tento:

A(60)
  printf(60)
  call B(60.left)
    B(30)
      call A(30.left)
        A(5)
          printf(5)
          call B(5.left)
            B(null)
          call B(5.right)
            B(8)
              call A(8.left)
                A(null)
              printf(8)
              call A(8.right)
                A(null)
      printf(30)
      call A(30.right)
        A(38)
        ...

Můžete snadno vidět, v jakém pořadí jsou uzly tištěný, a co je důležitější, proč se „skákat“ z tisku 8 do tisku 30 (jedna rekurzivní hovor ukončil a vy padá zpět o jednu úroveň).

Odpovězeno 14/12/2010 v 22:15
zdroj uživatelem

hlasů
1

stopa, jak je uvedeno výše, nemůže být správný pro buď předem pořadí, nebo v-pořadí Pre - 60, 30, 5, 8 35 32 atd V - 5, 8, 30, 32, 35 atd.

Odpovězeno 28/03/2011 v 09:59
zdroj uživatelem

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