рассчитать внутреннюю длину пути в BST только из предзаказа или postorder обхода

голоса
3

Привет StackOverflow сообщество!

Я пытаюсь выяснить, как рассчитать внутреннюю длину пути BST заданного только предзаказ или postorder обход (оно не должно иметь большое значения) без построения дерева; то есть, я хочу использовать только один из обходов, упомянутых выше. Это может быть простой ответ на большинство из вас, но, как вы, возможно, уже думали, что я совсем новичок на деревьях.

Ну любая мысль ценится и спасибо.

Задан 23/02/2011 в 06:01
источник пользователем
На других языках...                            


3 ответов

голоса
-1

Если я правильно понимаю вашу проблему это не может быть возможно. Рассмотрим два дерева

   A         A
  / \        |
 B   C       B
             |
             C

Они имеют один и тот же обход (ABC), но различную внутреннюю длину пути (2 и 3).

Ответил 23/02/2011 в 06:44
источник пользователем

голоса
0

Существует страница в http://geeksforgeeks.org/?p=6633 , что обсуждается построение дерева из его предзаказа и заказ обходов. Здесь, так как ваше дерево дерево поиска, вы имеете в своем порядке обхода неявно (используя порядок сортировки ключей). Вы можете использовать рекурсивный алгоритм , как тот , на этом сайте , чтобы вычислить уровень каждого узла дерева (без необходимости строить дерево), а затем добавить уровни вместе , чтобы получить внутреннюю длину пути. Этот алгоритм не может быть наиболее эффективным, так как он делает поиск на обходе , чтобы найти правильный ребенок каждого узла, но он должен работать. Это моя догадка о том , как сделать алгоритм однопроходный (предполагая , что все ключи различны):

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 мы неявно имеем Симметричный обход дерева (отсортированный список элементов).

Мы можем создать уникальное дерево от всего предзаказа или 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