υπολογισμό Εσωτερική μήκος διαδρομής της BST μόνο από την προ-παραγγελία ή postorder διάσχισης

ψήφοι
3

Γεια StackOverflow κοινότητα!

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

Καλά οποιαδήποτε σκέψη είναι ευπρόσδεκτη και ευχαριστώ.

Δημοσιεύθηκε 23/02/2011 στις 06:01
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
-1

Αν καταλαβαίνω το πρόβλημά σας μπορεί να μην είναι δυνατή. Εξετάστε τα δύο δέντρα

   A         A
  / \        |
 B   C       B
             |
             C

Αυτά έχουν το ίδιο διάσχιση preorder (ABC) αλλά διαφορετικών εσωτερικών μήκη διαδρομής (2 και 3).

Απαντήθηκε 23/02/2011 στις 06:44
πηγή χρήστη

ψήφοι
0

Υπάρχει μια σελίδα στο http://geeksforgeeks.org/?p=6633 που ασχολείται με την κατασκευή ενός δέντρου από την προ-παραγγελία του και σε σειρά διελεύσεων. Εδώ, αφού το δέντρο σας είναι ένα δέντρο αναζήτησης, έχετε τη διάσχιση στην παραγγελία έμμεσα (με την σειρά ταξινόμησης των κλειδιών). Μπορείτε να χρησιμοποιήσετε ένα αναδρομικό αλγόριθμο, όπως αυτή που σε αυτό το site για να υπολογίσει το ύψος του κάθε κόμβο του δένδρου (χωρίς να χρειάζεται να οικοδομήσουμε το δέντρο), στη συνέχεια προσθέστε τα επίπεδα μαζί για να πάρει την εσωτερική μήκος της διαδρομής. Ότι ο αλγόριθμος μπορεί να μην είναι η πιο αποτελεσματική, δεδομένου ότι κάνει αναζητήσεις στο διάσχιση για να βρει το σωστό παιδί του κάθε κόμβου, αλλά θα πρέπει να λειτουργεί. Αυτή είναι η καλύτερη εικασία μου για το πώς να κάνει ένα αλγόριθμο μονής διέλευσης (υποθέτοντας ότι όλα τα πλήκτρα είναι διακριτές):

int internal_path_length(key_iter& cur_node, key_iter end, int level, key max_key) {
  if (cur_node == end) return 0;
  key cur_key = *cur_node;
  if (cur_key > max_key) return 0;
  ++cur_node;
  int len1 = internal_path_length(cur_node, end, level + 1, cur_key);
  int len2 = internal_path_length(cur_node, end, level + 1, max_key);
  return len1 + len2 + level;
}

Αρχισε με:

key_iter i = preorder.begin();
internal_path_length(i, preorder.end(), 0, mk);

όπου mkείναι μεγαλύτερο από τον μεγαλύτερο δυνατό κλειδί στο δέντρο σας.

Απαντήθηκε 23/02/2011 στις 06:48
πηγή χρήστη

ψήφοι
0

Από την BST του έχουμε έχουμε σιωπηρά inorder διάσχιση του δέντρου (ταξινομημένη λίστα των στοιχείων).

Μπορούμε να δημιουργήσουμε ένα μοναδικό δέντρο από μόνο preorder ή postorder διάσχιση Pre θα είναι [R, κατάλογο των στοιχείων λιγότερο R, κατάλογο των στοιχείων μεγαλύτερο τότε R] Δημοσίευση θα είναι [λίστα των στοιχείων λιγότερο R, κατάλογο των στοιχείων μεγαλύτερο τότε R, Ε]

Κωδικός Ψευδο θα μοιάζει με αυτό.

findIPLPreOrder(poArray,startIndex,endIndex, height) {
     if(startIndex==endIndex){
          retrn height;
     }
     m=findIndexOfEndofLeftSubTree(poArray,start,end);
     return findIPLPreOrder(poArray,start+1,m,height + 1) + findIPLPreOrder(poArray,m+1,end,height + 1);     
}

findIndexOfEndofLeftSubTree(poArray,start,end){
  R=poArray[start]
  for(i=start+1;i<=end;i++){
     if(R < poArray[i]){
         return i-1;
       }
  }
}
Απαντήθηκε 23/02/2011 στις 06:52
πηγή χρήστη

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