obliczyć długość drogi wewnętrzne o BST tylko z przedsprzedaży lub postorder przechodzenie

głosy
3

Witam StackOverflow społeczność!

Próbuję dowiedzieć się, jak obliczyć wewnętrzną długość ścieżki BST danej tylko preorder lub przechodzenie postorder (nie powinno to dużej różnicy) bez konstruowania drzewa; to znaczy chcę użyć tylko jednego z przechodzenia przez wymienionych powyżej. Może to być prosta odpowiedź na większość z was, ale jak można się już myślałem, że jestem zupełnie nowy na drzewach.

Cóż każdy myśl jest doceniana i dzięki.

Utwórz 23/02/2011 o 06:01
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
-1

Jeśli rozumiem problemu może nie być możliwe. Rozważmy dwa drzewa

   A         A
  / \        |
 B   C       B
             |
             C

Mają one tę samą przechodzenie preorder (ABC), ale różne odcinki wewnętrzne ścieżki (2 i 3).

Odpowiedział 23/02/2011 o 06:44
źródło użytkownik

głosy
0

Jest to strona, na http://geeksforgeeks.org/?p=6633 który omawia budowanie drzewa z jego przedsprzedaży iw zamówienie przechodzenia przez. Tutaj, ponieważ drzewo jest drzewem wyszukiwania, masz przechodzenie na zamówienie dorozumiany (używając porządek kluczy). Można użyć algorytmu rekurencyjnego jak ten w tym miejscu, aby obliczyć poziom każdego węzła drzewa (bez konieczności budowania drzewa), a następnie dodać poziomy razem, aby uzyskać wewnętrzną długość ścieżki. Że algorytm może nie być najbardziej efektywny, ponieważ robi wyszukiwania na przechodzenie znaleźć właściwą dziecku każdego węzła, ale powinno działać. To jest mój najlepszy przypuszczenie na jak zrobić algorytm single-Pass (przy założeniu, że wszystkie klucze są różne):

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

Zacząć od:

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

gdzie mkjest większy od największego możliwego klucza w drzewie.

Odpowiedział 23/02/2011 o 06:48
źródło użytkownik

głosy
0

Ponieważ jego BST mamy niejawnie mieć Inorder przechodzenie drzewa (posortowaną listę elementów).

Możemy stworzyć niepowtarzalny drzewa z tylko preorder lub postorder przejścia Pre będzie [R, wykaz elementów mniej niż R, wykaz elementów większy niż R] Post zostanie [lista elementów mniej niż R, wykaz elementów większy niż R, R]

pseudo kod będzie wyglądać następująco.

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;
       }
  }
}
Odpowiedział 23/02/2011 o 06:52
źródło użytkownik

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