calcula lungimea căii internă a unui BST numai de la precomandă sau parcurgeri postordine

voturi
3

Salutare, comunitate StackOverflow!

Am încercat să dau seama cum să calculeze lungimea căii interne a BST date numai precomanda sau traversal postordine (aceasta nu ar trebui să facă diferența de mult) fără a construi copac; adică, vreau să folosesc doar una dintre traversări menționate mai sus. Acest lucru poate fi un răspuns simplu la cele mai multe dintre voi, dar după cum s-ar fi gândit deja că sunt destul de nou la copaci.

Ei bine, orice gând este apreciat multumita.

Întrebat 23/02/2011 la 06:01
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
-1

Dacă am înțeles problema ta nu poate fi posibil. Luați în considerare cei doi copaci

   A         A
  / \        |
 B   C       B
             |
             C

Acestea au aceeași traversal preordine (ABC), dar diferite lungimi de cale interioare (2 și 3).

Publicat 23/02/2011 la 06:44
sursa de către utilizator

voturi
0

Există o pagină la http://geeksforgeeks.org/?p=6633 care discută despre construirea unui copac de la precomandă și în ordine traversări. Aici, din moment ce copac este un copac de căutare, aveți în ordine traversal implicit (folosind ordinea de sortare a cheilor). Puteți utiliza un algoritm recursiv ca cel de la site - ul pentru a calcula nivelul fiecărui nod arbore (fără a fi nevoie pentru a construi copac), apoi se adaugă nivelurile împreună pentru a obține lungimea drumului intern. Acest lucru algoritm ar putea să nu fie cel mai eficient, din moment ce face căutări pe traversal pentru a găsi copilul dreptul fiecărui nod, dar ar trebui să funcționeze. Acest lucru este cel mai bine părerea mea cu privire la modul de a face un algoritm de o singură trecere (presupunând că toate cheile sunt distincte):

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

Începe cu:

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

în cazul în care mkeste mai mare decât cea mai mare cheie posibilă în arborele.

Publicat 23/02/2011 la 06:48
sursa de către utilizator

voturi
0

Din moment ce sa o BST, am avea implicit inordine Traversarea arborelui (lista de elemente sortate).

Putem crea un copac unic de la doar precomanda sau postordine parcurgeri Pre va fi [R, lista de elemente mai puțin R, lista de elemente mai mari, atunci R] Acest post va fi [lista de elemente mai puțin R, lista de elemente mai mare decât R, R]

Codul Pseudo va arăta acest lucru.

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;
       }
  }
}
Publicat 23/02/2011 la 06:52
sursa de către utilizator

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