Bináris fák - követése révén kód

szavazat
0

Mivel a bináris fa alább látható, meghatározza a sorrendet, amelyben a csomópontok a bináris fa alábbi látogatott feltételezve, hogy a függvény A (root) hivatkoznak. Tegyük fel, hogy a fa csomópontok és mutatók meghatározása a látható. Tegyük fel, hogy a root egy mutató a csomópont tartalmazó 60. A válaszom erre a problémára az alábbiakban közöljük. Ez a helyes? Mit csináltam rosszul?

                                   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);
   }
 }   

Válasz: A void A azt mondja, hogy az első nyomat node_ptr-> adatokat, így 60 lett nyomtatva, akkor a függvény hívások B (node_ptr-> balra), majd a B, A hívódik (node_ptr-> balra), akkor nyomtasson, hogy az adatok, amely 5 ., majd egy (node_ptr-> jobbra) hívódik visszamenni az a, nyomtatási, hogy az adatok, így a 8. lett nyomtatva. Most Im nem biztos, hogy mi a teendő, de kapok logikusan érdemes lenne kinyomtatni 30, de nem vagyok biztos benne, hogy a ptr kap 8 és 30. És akkor, ha továbbra is ugyanazt a mintát 38 lett nyomtatva és 32. lett nyomtatva. A jobb oldali részfa ... 90 77 62 88

A kérdést 14/12/2010 22:05
a forrás felhasználó
Más nyelveken...                            


4 válasz

szavazat
1

Először is, a kód van egy csomó hibát benne. Gondolom meg kell több, mint ez:

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);
    }
}   

Te is keverés két különböző bejárási algoritmusok. A()a pre-order, B()van-sorrendben. A()és B()meg kell hívni magukat, nem egymást. (Még egy ok, hogy az igazi változó / funkció nevek helyett A, Bés az ilyen.)

Válaszolt 14/12/2010 22:11
a forrás felhasználó

szavazat
1

Csak kiírja a teljes végrehajtási verem idővel. Mint ez:

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

(A maradék fa balra egy gyakorlatot, hogy az olvasó.)

Akkor csak menj a tetejétől az aljáig, leírom az eredményeket a printf.

Válaszolt 14/12/2010 22:14
a forrás felhasználó

szavazat
1

Aegy pre-order bejárás, mivel Begy in-order bejárás.

Egy egyszerű módja annak, hogy kitaláljuk, a nyomtatás sorrendje az, hogy nézd meg, hogyan keresse fel a csomópontok magukat. Én általában felhívni vázlata külseje körül a fa (a gyökértől kiindulva, és halad át a bal vagy a jobb alapuló sub-tree akkor áthaladó először). Ha csinálok egy előrendelést bejárás, én kinyomtatni egy csomópont valahányszor mozognak a külső . Ha csinálok egy in-order bejárás, én nyomtassa ki a csomópont csak akkor, ha mozgok alatt azt (ennek van értelme, ha megnézi az rendű bejárási, mert akkor a végén kinyomtatja a levelek először, ők az első csomópont mozog alatt , ha rajzoljuk körbe). Ha csinálok egy poszt-sorrendben bejárás, én nyomtassa ki a csomópont csak akkor, ha mozognak a belsejében .

UPDATE

Az ok 30 lett nyomtatva után az 5. és a 8. hogy nem teljesítő tisztán előrendelést bejárás. Te ugrás között egy előrendelést és helyszíni bejárás érdekében.

Egy egyszerű módja, hogy kitaláljuk a rend az, hogy ténylegesen írd le a lépéseket a kódot megy keresztül, ahogy nyoma rajta (gyakran alkalmazom toll / ceruza és papír, hogy az információk együtt). Például, akkor nem írja ki a call-stack, mint ez:

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

Könnyen látni a sorrendet, amelyben a csomópontok vannak nyomtatva, és ami még fontosabb, hogy miért „ugrik” nyomtassanak 8 nyomtatás 30 (egy rekurzív hívás véget ért, és te visszaesnek egy szintet).

Válaszolt 14/12/2010 22:15
a forrás felhasználó

szavazat
1

a nyomkövetési fentiek nem lehet helyes akár Előrendelés vagy In-érdekében Pre - 60, 30, 5, 8 35 32 stb - 5, 8, 30, 32, 35 stb

Válaszolt 28/03/2011 09:59
a forrás felhasználó

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