Binary Δένδρα - Εντοπισμός μέσω κωδικού

ψήφοι
0

Δεδομένης της δυαδικό δένδρο που δείχνεται παρακάτω, καθορίζουν τη σειρά με την οποία οι κόμβοι του δυαδικού δένδρου που δείχνεται παρακάτω επισκέφθηκε την παραδοχή ότι η λειτουργία Α (root) γίνεται επίκληση. Ας υποθέσουμε ότι οι κόμβοι δέντρο και δείκτες που ορίζονται όπως φαίνεται. Ας υποθέσουμε ότι ρίζα είναι ένας δείκτης στον κόμβο που περιέχει 60. Η απάντησή μου σε αυτό το πρόβλημα δίνεται παρακάτω. Είναι σωστό? Τι εκανα λαθος?

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

Απάντηση: Στο κενό Ένας λέει στην πρώτη εκτύπωση node_ptr-> δεδομένα έτσι 60 θα εκτυπωθεί Στη συνέχεια, η συνάρτηση καλεί B (node_ptr-> αριστερά), στη συνέχεια, στο πλαίσιο Β, Α παίρνει ονομάζεται (node_ptr-> αριστερά), τότε μπορείτε να εκτυπώσετε τα δεδομένα που είναι 5 . Και τότε A (node_ptr-> δεξιά) παίρνει ονομάζεται πάει πίσω μέχρι Α, εκτύπωσης των δεδομένων, ώστε 8 θα εκτυπωθεί. Τώρα δεν είμαι τόσο σίγουρος τι να κάνω τώρα, αλλά έχω πάρει λογικά θα είχε νόημα να εκτυπώσετε 30, αλλά δεν είμαι σίγουρος πως η ptr παίρνει από 8 έως 30. Και στη συνέχεια, αν συνεχίσει στο ίδιο μοτίβο 38 θα εκτυπωθεί και 32 θα εκτυπωθεί. Για τη σωστή υποδέντρο ... 90 77 62 88

Δημοσιεύθηκε 14/12/2010 στις 22:05
πηγή χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
1

Για αρχή, ο κωδικός σας έχει ένα σωρό λάθη σε αυτό. Υποθέτω ότι θα πρέπει να είναι περισσότερο σαν αυτό:

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

Είσαι επίσης την ανάμιξη δύο διαφορετικοί αλγόριθμοι διάσχισης. A()είναι προ-παραγγελία, B()είναι σε-σειρά. A()και B()θα πρέπει να καλούν τον εαυτό τους, όχι ο ένας τον άλλον. (Ακόμα ένας λόγος για να χρησιμοποιήσετε πραγματικής μεταβλητής / ονόματα λειτουργία και όχι A, Bκαι τέτοια.)

Απαντήθηκε 14/12/2010 στις 22:11
πηγή χρήστη

ψήφοι
1

Απλά γράψτε την πλήρη στοίβα εκτέλεσης πάροδο του χρόνου. Σαν αυτό:

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

(Το υπόλοιπο του δέντρου αριστερά ως άσκηση για τον αναγνώστη.)

Στη συνέχεια, απλά πηγαίνετε από πάνω προς τα κάτω, καταγράφοντας τα αποτελέσματα των δηλώσεων printf.

Απαντήθηκε 14/12/2010 στις 22:14
πηγή χρήστη

ψήφοι
1

Aείναι ένας διάσχιση προ-παραγγελία, ενώ Bαποτελεί διάσχιση σε-σειρά.

Ένας εύκολος τρόπος για να καταλάβουμε τη σειρά της εκτύπωσης είναι να δούμε πώς μπορείτε να επισκεφθείτε τα ίδια κόμβους. Συνήθως σχεδιάσετε ένα περίγραμμα γύρω από το εξωτερικό του δέντρου (ξεκινώντας από τη ρίζα και κινείται μέσα από την αριστερά ή δεξιά με βάση την υπο-δέντρο που διέρχονται πρώτα). Αν κάνω μια διάσχιση προ-παραγγελία, θα εκτυπώσετε ένα κόμβο κάθε φορά που κινούνται κατά μήκος έξω του . Αν κάνω μια διάσχιση στη σειρά, μπορώ να εκτυπώσω ένα κόμβο μόνο όταν κινούνται κάτω από αυτό (αυτό έχει νόημα, εάν κοιτάξει κανείς διελεύσεις σε σειρά, γιατί θα καταλήξετε την εκτύπωση των φύλλων πρώτα? Αυτοί είναι οι πρώτοι κόμβοι κινείστε κάτω , όταν σχεδιάζετε το περίγραμμα). Αν κάνω μια διάσχιση μετά την παραγγελία, θα εκτυπώσετε ένα κόμβο μόνο όταν κινούνται κατά μήκος της μέσα .

ΕΚΣΥΓΧΡΟΝΙΖΩ

Ο λόγος για τον 30 θα εκτυπωθεί μετά από 5 και 8 είναι ότι δεν αποδίδουν μια διάσχιση καθαρά προ-παραγγελία. Είσαι άλμα μεταξύ ενός προ-παραγγελία και την διάσχιση σε σειρά.

Ένας εύκολος τρόπος για να καταλάβουμε την εντολή είναι να γράψει πραγματικά τα βήματα κωδικό σας πηγαίνει μέσα, όπως να εντοπίζουν μέσα από αυτό (που συχνά χρησιμοποιούν στυλό / μολύβι και χαρτί για να κρατήσει τις πληροφορίες μαζί). Για παράδειγμα, θα μπορούσατε να κάνετε γράψετε μια κλήση στοίβα όπως αυτό:

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

Μπορείτε εύκολα να δείτε τη σειρά με την οποία οι κόμβοι εκτυπωθούν, και το πιο σημαντικό, γιατί «άλμα» από την εκτύπωση 8 με την εκτύπωση 30 (μια αναδρομική κλήση έχει λήξει και πέφτετε πίσω ένα επίπεδο).

Απαντήθηκε 14/12/2010 στις 22:15
πηγή χρήστη

ψήφοι
1

το ίχνος όπως αναφέρεται ανωτέρω δεν μπορεί να είναι σωστές για είτε Προ-παραγγελία ή In-Για Pre - 60, 30, 5, 8 35 32 κλπ In - 5, 8, 30, 32, 35 κ.λπ.

Απαντήθηκε 28/03/2011 στις 09:59
πηγή χρήστη

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