Copaci binare - Tracing prin cod

voturi
0

Dată fiind arborele binar prezentat mai jos, determină ordinea în care nodurile arborelui binar prezentate mai jos sunt vizitate presupunând funcția A (root) este invocată. Să presupunem că nodurile de arbori și indicatoarele sunt definite după cum se arată. Să presupunem că rădăcină este un pointer la nodul care conține 60. Răspunsul meu la această problemă este prezentată mai jos. Este corect? Ce am făcut greșit?

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

Raspuns: In nule A se spune pentru a imprima primele node_ptr-> 60 de date , astfel devine imprimate atunci funcția apel B (node_ptr-> stânga) , apoi în interiorul B, A se numește (node_ptr-> stânga) , apoi imprimați datele care este de 5 . Și apoi a (node_ptr-> dreapta) se numește du - te înapoi până la a, de imprimare care datele astfel încât 8 se imprimă. Acum , Im nu atât de sigur ce să fac în continuare , dar am obține în mod logic , ar avea sens pentru a imprima 30 , dar Im nu sunt sigur cum PTR ajunge de la 8 la 30. Și apoi , dacă continuați în același model 38 devine imprimat și 32 se imprimă. Pentru subarborelui drept ... 90 77 62 88

Întrebat 14/12/2010 la 22:05
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
1

Pentru început, codul are o grămadă de erori în ea. Cred că ar trebui să fie mai mult ca acest lucru:

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

Tu de amestecare , de asemenea , doi algoritmi traversal diferite. A()este pre-comanda, B()este în ordine. A()și B()ar trebui să fie să se numească, nu unul pe altul. ( Cu toate acestea , un alt motiv pentru a utiliza variabila reala / numele de funcții în loc de A, Bși astfel.)

Publicat 14/12/2010 la 22:11
sursa de către utilizator

voturi
1

Doar scrie stivă completă de execuție a lungul timpului. Asa:

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

(Restul copacului a lăsat ca exercițiu pentru cititor.)

Apoi, du-te doar de sus în jos, scris în jos rezultatele declarațiilor printf.

Publicat 14/12/2010 la 22:14
sursa de către utilizator

voturi
1

Aeste o traversal precomandă, în timp ce Beste un parcurgeri în ordine.

Un mod ușor pentru tine să dau seama de ordinea de imprimare este sa se uite la modul în care vizitați nodurile ei înșiși. Eu de obicei , desena un contur în jurul exteriorului copac (începând de la rădăcină și se deplasează prin stânga sau la dreapta bazat pe sub-arborele pe care îl traversează mai întâi). Dacă eu fac un traversal precomandă, am imprima un nod de fiecare dată când mă mișc de-a lungul în afara acesteia . Dacă eu fac un parcurgeri în ordine, am imprima un nod numai când mă mișc sub ea (acest lucru are sens atunci când te uiți la traversări în-ordine, pentru că va termina imprimarea frunzele mai întâi, ele sunt primele noduri pe care le muți în conformitate atunci când desenați conturul). Dacă eu fac un traversal post-comanda, am imprima un nod numai când mă mișc de-a lungul său interior .

ACTUALIZAȚI

Motivul pentru care 30 se imprimă după 5 și 8 este că nu efectuați o traversal pur precomandă. Te sari între o pre-comanda și un traversal în ordine.

O modalitate simplă de a descoperi ordinea este de a scrie de fapt în jos pașii codul prin care trece în timp ce urmări prin ea (eu folosesc frecvent stilou / creion și hârtie pentru a păstra informațiile împreună). De exemplu, ai putea face scrie un apel stiva de genul:

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

Puteti vedea cu ușurință ordinea în care sunt imprimate nodurile, și mai important, de ce „sari“ de la 8 la imprimarea de imprimare 30 (un apel recursiv a luat sfârșit și te încadrează înapoi cu un nivel).

Publicat 14/12/2010 la 22:15
sursa de către utilizator

voturi
1

trace așa cum este indicat mai sus nu poate fi corect pentru nici unul dintre pre-comandă sau în ordinul Pre - 60, 30, 5, 8 35 32 etc In - 5, 8, 30, 32, 35 etc.

Publicat 28/03/2011 la 09:59
sursa de către utilizator

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