【发布时间】:2021-10-19 11:56:58
【问题描述】:
如何在不构造树的情况下从前序遍历和中序遍历中找到树的层序遍历?
【问题讨论】:
标签: tree tree-traversal inorder preorder
如何在不构造树的情况下从前序遍历和中序遍历中找到树的层序遍历?
【问题讨论】:
标签: tree tree-traversal inorder preorder
让我们看一个示例二叉树:
5
/ \
2 8
/ \ / \
1 4 7 9
/ / \
3 6 10
这棵树有这些前序和中序遍历:
一些观察:
1 2 3 4) ,并且跟随该位置的值表示右子树的中序遍历(在示例中:6 7 8 9 10)2 1 4 3),其余的值代表右子树的前序遍历(在示例中:8 7 6 9 10)这是该想法在 JavaScript 中的实现:
function getLevelOrder(preorder, inorder) {
let result = [];
// An entry in the queue has 4 indicators:
// the start/end index of the preorder traversal
// and the start/end index of the inorder traversal
let q = [[0, preorder.length, 0, preorder.length]];
while (q.length) {
let [startPre, endPre, startIn, endIn] = q.shift();
if (startPre < endPre) {
let root = preorder[startPre];
result.push(root);
let idxIn = inorder.indexOf(root, startIn);
let leftSize = idxIn - startIn;
q.push([startPre+1, startPre+1+leftSize, startIn, idxIn]);
q.push([startPre+1+leftSize, endPre, idxIn+1, endIn]);
}
}
return result;
}
// Define input values of the sample tree:
let preorder = [5, 2, 1, 4, 3, 8, 7, 6, 9, 10];
let inorder = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// Execute the algorithm
let levelorder = getLevelOrder(preorder, inorder);
// Output the result
console.log(levelorder);
【讨论】: