beregne Intern banelengde på en BST bare fra forhåndsbestilling eller Postorder traversering

stemmer
3

Hei Stackoverflow fellesskapet!

Jeg prøver å finne ut hvordan man skal beregne den interne veilengde BST gitt kun forhåndsbestilling eller Postorder traversering (det bør ikke gjøre mye forskjell) uten å konstruere treet; det vil si, jeg ønsker å bruke bare en av gjennomløping nevnt ovenfor. Dette kan være et enkelt svar på de fleste av dere, men som du kanskje allerede har tenkt jeg er ganske ny på trær.

Vel noen tanke er verdsatt og takk.

Publisert på 23/02/2011 klokken 05:01
kilden bruker
På andre språk...                            


3 svar

stemmer
-1

Hvis jeg forstår problemet ditt kan det ikke være mulig. Vurdere de to trærne

   A         A
  / \        |
 B   C       B
             |
             C

Disse har den samme forhåndsbestillings traversering (ABC) men forskjellige innvendige banelengder (2 og 3).

Svarte 23/02/2011 kl. 05:44
kilden bruker

stemmer
0

Det er en side på http://geeksforgeeks.org/?p=6633 som diskuterer bygge et tre fra sin forhåndsbestilling og i for gjennomløping. Her, siden treet er et søketre, har du i for traversering implisitt (ved hjelp av sorteringsrekkefølgen for nøkler). Man kan bruke en rekursiv algoritme som den på dette området for å beregne nivået for hver tre node (uten å måtte bygge treet), og deretter legge nivåene sammen for å få den indre banelengden. At algoritmen er kanskje ikke den mest effektive, siden det gjør søk på traversering å finne den rette barnet i hver node, men det skal fungere. Dette er min beste gjetning på hvordan du gjør en single-pass algoritme (forutsatt at alle tastene er tydelig):

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

Starte med:

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

der mker større enn størst mulig nøkkelen i treet.

Svarte 23/02/2011 kl. 05:48
kilden bruker

stemmer
0

Siden en BST har vi implisitt har inorder traversering av treet (sortert liste over elementer).

Vi kan skape et unikt tre fra bare forhåndsbestiller eller Postorder traversering Pre vil være [R, liste over elementer mindre enn R, liste over elementer større enn R] Innlegg blir [liste over elementer mindre deretter R, liste over elementer større enn R, R]

Pseudo-kode vil se slik ut.

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;
       }
  }
}
Svarte 23/02/2011 kl. 05:52
kilden bruker

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