Восстановить двоичное дерево с помощью PreOrder и InOrder - Javascript

Может ли кто-нибудь научить меня, как восстановить двоичное дерево, используя массивы Prorder и Inorder. Я видел несколько примеров (ни одного в JavaScript), и они вроде как имеют смысл, но рекурсивный вызов никогда не возвращает полное дерево, когда я пытаюсь писать. Тоже хотелось бы увидеть пояснения. Вот код для начала:

Создание узла дерева использует это:

function Tree(x) { 
  this.value = x;
  this.left = null;
  this.right = null;
}

Создание дерева использует это:

function retoreBinaryTree(inorder, preorder) {

}

Некоторый пример ввода:

inorder = [4,2,1,5,3]
preorder = [1,2,4,3,5,6]

inorder = [4,11,8,7,9,2,1,5,3,6]
preorder = [1,2,4,11,7,8,9,3,5,6]

EDIT Я работал над этим в течение нескольких дней и не смог придумать собственное решение, поэтому я искал некоторые из них (большинство из них были написаны на Java). Я попытался имитировать это решение, но но безрезультатно.


person Stephen Agwu    schedule 30.07.2017    source источник
comment
Я попытался создать рекурсивную функцию, называемую построением дерева, которая принимала бы список предварительного и неупорядоченного порядка, а также переменные, обозначающие числа, такие как начало и конец. Функция создаст узел, отрегулирует начало и конец на основе индекса значения этого узла. Найдите левый и правый узлы, если они существуют, затем верните узел. Проблема в том, что он никогда не возвращал полное дерево. Здесь я опубликую, где я нашел это решение.   -  person Stephen Agwu    schedule 30.07.2017


Ответы (1)


Это решение на С++, которое, я думаю, вы могли бы перевести без проблем:

/* keys are between l_p and r_p in the preorder array

   keys are between l_i and r_i in the inorder array
 */
Node * build_tree(int preorder[], long l_p, long r_p,
          int inorder[], long l_i, long r_i)
{
  if (l_p > r_p)
    return nullptr; // arrays sections are empty

  Node * root = new Node(preorder[l_p]); // root is first key in preorder
  if (r_p == l_p)
    return root; // the array section has only a node

  // search in the inorder array the position of the root
  int i = 0;
  for (int j = l_i; j <= r_i; ++j)
    if (inorder[j] == preorder[l_p])
      {
        i = j - l_i;
        break;
      }

  root->left = build_tree(preorder, l_p + 1, l_p + i, 
              inorder, l_i, l_i + (i - 1));
  root->right = build_tree(preorder, l_p + i + 1, r_p, 
               inorder, l_i + i + 1, r_i);

  return root;
}
person lrleon    schedule 30.07.2017