vypočítat vnitřní délka dráhy BST pouze z předobjednávku nebo postorder průchod

hlasů
3

Hello StackOverflow komunita!

Snažím se přijít na to, jak vypočítat vnitřní dráhu o délce BST dané pouze preorder nebo postorder traversal (to by nemělo mít žádný význam), aniž by budování stromu; to znamená, že chci použít pouze jeden z traversals výše uvedených. Může to být jednoduchá odpověď na většinu z vás, ale jak jste si možná už si myslel, že jsem docela nové na stromech.

No jakákoliv myšlenka se cení a díky.

Položena 23/02/2011 v 06:01
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
-1

Pokud chápu váš problém, nemusí být možné. Podívejme se na dva stromy

   A         A
  / \        |
 B   C       B
             |
             C

Ty mají stejný preorder Traversal (ABC), ale různé délky vnitřní dráha (2 a 3).

Odpovězeno 23/02/2011 v 06:44
zdroj uživatelem

hlasů
0

Tam je stránka na http://geeksforgeeks.org/?p=6633 nichž se hovoří v budování stromu ze svého předobjednávku a in-pořadí traversals. Tady, protože váš strom je vyhledávací strom, máte in-pořadí Traversal implicitně (pomocí pořadí řazení klíčů). Můžete použít rekurzivní algoritmus, jako je ta na tomto místě pro výpočet úrovně každého uzlu stromu (aniž by bylo nutné stavět strom), přidejte úroveň dohromady, aby vnitřní délku cesty. Že algoritmus nemusí být nejúčinnější, protože to dělá vyhledávání na průchod najít tu správnou dítě každého uzlu, ale to by mělo fungovat. To je můj nejlepší odhad, jak to udělat algoritmus single-pass (za předpokladu, že všechna tlačítka jsou odlišné):

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

Začít s:

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

kde mkje větší než největší možný klíč ve vašem stromě.

Odpovězeno 23/02/2011 v 06:48
zdroj uživatelem

hlasů
0

Od svého BST jsme mít implicitně nezbytného průchod stromu (seřazený seznam prvků).

Můžeme vytvořit jedinečný strom již od predobjednat nebo postorder traversal Pre bude [R, seznam prvků menší než R, seznam prvků větší než R] Příspěvek bude [seznam prvků menší než R, seznam prvků větší než R, R]

Pseudo kód bude vypadat takto.

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;
       }
  }
}
Odpovězeno 23/02/2011 v 06:52
zdroj uživatelem

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