Может ли кто-нибудь научить меня, как восстановить двоичное дерево, используя массивы 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). Я попытался подражать этому решению, но безрезультатно.
Это решение в C++, которое, я думаю, можно перевести без проблем:
/* 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;
}