δυαδικό δέντρο -Εκτύπωση τα στοιχεία ανάλογα με το επίπεδο

ψήφοι
6

Αυτή η ερώτηση τέθηκε σε μένα σε μια συνέντευξη:

δυαδικό

ας πούμε ότι έχουμε πάνω από δυαδικό δέντρο, πώς μπορώ να παράγει μια έξοδο όπως παρακάτω

2 7 5 2 6 9 5 11 4

Απάντησα όπως μπορεί να είναι να έχουμε μια μεταβλητή count επίπεδο και να εκτυπώσετε όλα τα στοιχεία διαδοχικά ελέγχοντας την καταμέτρηση επίπεδο μεταβλητή του κάθε κόμβου. μάλλον έκανα λάθος.

μπορεί κανείς να δώσει anyidea για το πώς μπορούμε να το επιτύχουμε αυτό;

Δημοσιεύθηκε 14/04/2011 στις 08:07
πηγή χρήστη
Σε άλλες γλώσσες...                            


7 απαντήσεις

ψήφοι
2

Η διάσχιση στην ερώτησή σας ονομάζεται level-order traversalκαι αυτό είναι πώς γίνεται (πολύ απλό / καθαρό απόσπασμα κώδικα που βρήκα).

Μπορείτε βασικά να χρησιμοποιήσετε μια ουρά και τη σειρά των εργασιών θα είναι κάπως έτσι:

enqueue F
dequeue F
enqueue B G
dequeue B
enqueue A D
dequeue G
enqueue I
dequeue A
dequeue D
enqueue C E
dequeue I
enqueue H
dequeue C
dequeue E
dequeue H

Γι 'αυτό το δέντρο (κατ' ευθείαν από την Wikipedia):
εισάγετε περιγραφή της εικόνας εδώ

Απαντήθηκε 14/04/2011 στις 08:14
πηγή χρήστη

ψήφοι
2

Ο όρος για αυτό είναι διάσχιση επίπεδο τάξης . Wikipedia περιγράφει έναν αλγόριθμο για το ότι η χρήση μιας ουράς :

levelorder(root) 
  q = empty queue
  q.enqueue(root)
  while not q.empty do
    node := q.dequeue()
    visit(node)
    if node.left ≠ null
      q.enqueue(node.left)
    if node.right ≠ null
      q.enqueue(node.right)
Απαντήθηκε 14/04/2011 στις 08:14
πηγή χρήστη

ψήφοι
2

BFS :

std::queue<Node const *> q;
q.push(&root);
while (!q.empty()) {
    Node const *n = q.front();
    q.pop();
    std::cout << n->data << std::endl;
    if (n->left)
        q.push(n->left);
    if (n->right)
        q.push(n->right);
}

Επαναληπτική εμβάθυνση θα μπορούσε να λειτουργήσει επίσης και αποθηκεύει τη χρήση της μνήμης, αλλά εις βάρος του χρόνου υπολογισμού.

Απαντήθηκε 14/04/2011 στις 08:16
πηγή χρήστη

ψήφοι
6

Θα χρειαστεί να κάνετε ένα εύρος πρώτη διάσχιση του δέντρου. Εδώ περιγράφεται ως εξής:

Πλάτος-πρώτη διάσχιση: πρώτα κατά βάθος δεν είναι ο μόνος τρόπος για να περάσουν από τα στοιχεία ενός δέντρου. Ένας άλλος τρόπος είναι να περάσουν από τα επίπεδα-από-επίπεδο.

Για παράδειγμα, κάθε στοιχείο υπάρχει σε ένα ορισμένο επίπεδο (ή βάθος) στο δέντρο:

    tree
      ----
       j         <-- level 0
     /   \
    f      k     <-- level 1
  /   \      \
 a     h      z  <-- level 2
  \
   d             <-- level 3

άνθρωποι σαν τον αριθμό πράγματα ξεκινώντας από το 0.)

Έτσι, αν θέλουμε να επισκεφθείτε τα στοιχεία επίπεδο-από-επίπεδο (και από αριστερά προς τα δεξιά, όπως συνήθως), θα ξεκινήσει στο επίπεδο 0 με j, τότε πηγαίνετε στο επίπεδο 1 για την f και k, τότε πηγαίνετε στο επίπεδο 2 για ένα, h και z, και, τέλος, πάμε στο επίπεδο 3 για d.

Αυτό το επίπεδο-από-επίπεδο διάσχισης ονομάζεται πλάτος διάσχιση γιατί διερευνήσει το εύρος, δηλαδή, όλο το πλάτος του δέντρου σε ένα δεδομένο επίπεδο, πριν πάει βαθύτερα.

Απαντήθηκε 14/04/2011 στις 08:16
πηγή χρήστη

ψήφοι
0

Θα ήθελα να χρησιμοποιήσει μια συλλογή, για παράδειγμα std::list, να αποθηκεύουν όλα τα στοιχεία του σήμερα εκτυπώνονται επίπεδο:

  1. Συλλέξτε δείκτες σε όλους τους κόμβους του σημερινού επιπέδου στο δοχείο
  2. Εκτύπωση των κόμβων που απαριθμούνται στο δοχείο
  3. Κάντε ένα νέο δοχείο, προσθέστε τα subnodes όλων των κόμβων στο δοχείο
  4. Αντικαταστήσετε το παλιό δοχείο με το νέο δοχείο
  5. επαναλάβετε μέχρι δοχείο είναι άδειο
Απαντήθηκε 14/04/2011 στις 08:18
πηγή χρήστη

ψήφοι
0

ως παράδειγμα του τι μπορείτε να κάνετε σε μια συνέντευξη, αν δεν θυμάστε / δεν ξέρω το «επίσημο» αλγόριθμο, η πρώτη μου ιδέα ήταν - τραβέρσα το δέντρο στο κανονικό προ-παραγγελία σύροντας ένα μετρητή επιπέδου μαζί, διατηρώντας ένα διάνυσμα που συνδέονται λίστες των δεικτών σε κόμβους ανά επίπεδο, π.χ.

levels[level].push_back(&node);

και στο τέλος να εκτυπώσετε τη λίστα του κάθε επιπέδου.

Απαντήθηκε 14/04/2011 στις 08:39
πηγή χρήστη

ψήφοι
2

Αν είμαστε σε θέση να φέρω το επόμενο στοιχείο στο ίδιο επίπεδο, είμαστε έτοιμοι να προχωρήσουμε. Σύμφωνα με προηγούμενη γνώση μας , μπορούμε να έχουμε πρόσβαση αυτά τα στοιχεία χρησιμοποιώντας το εύρος πρώτη διάσχιση.

Τώρα μόνο πρόβλημα είναι πώς να ελέγξετε αν είμαστε στο τελευταίο στοιχείο σε κάθε επίπεδο. Για το λόγο αυτό, θα πρέπει να προσαρτώντας ένα διαχωριστικό (NULL σε αυτή την περίπτωση) για να σηματοδοτήσει τέλος του επιπέδου.

Αλγόριθμος: 1. ρίζα Βάλτε στην ουρά.
2. Βάλτε NULL στην ουρά.
3. Ενώ Queue δεν είναι άδειο
4. x = φέρω πρώτο στοιχείο από την ουρά
5. Εάν το Χ δεν είναι NULL
6. x-> rpeer <= κορυφή στοιχείο της ουράς.
7. Τοποθετήστε το αριστερό και το δεξί παιδί του x στην ουρά
8. άλλος
9. αν ουρά δεν είναι κενή
10. τεθεί NULL στην ουρά
11. τέλος, αν
12. τέλος, ενώ
13. επιστροφής

#include <queue>

void print(tree* root)
{
  queue<tree*> que;
  if (!root)
      return;

  tree *tmp, *l, *r;
  que.push(root);
  que.push(NULL);

  while( !que.empty() )
  {
      tmp = que.front();
      que.pop();
      if(tmp != NULL)
      {
          cout << tmp=>val;  //print value
          l = tmp->left;
          r = tmp->right;
          if(l) que.push(l);
          if(r) que.push(r);
      }
      else
      {
          if (!que.empty())
              que.push(NULL);
      }
  }
  return;
}
Απαντήθηκε 14/04/2011 στις 11:55
πηγή χρήστη

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