【问题标题】:Level order traversal of tree from inorder and pre order traversal从 inorder 和 pre order 遍历树的 level order 遍历
【发布时间】:2021-10-19 11:56:58
【问题描述】:

如何在不构造树的情况下从前序遍历和中序遍历中找到树的层序遍历?

【问题讨论】:

    标签: tree tree-traversal inorder preorder


    【解决方案1】:

    让我们看一个示例二叉树:

           5
         /    \
        2      8
       / \    / \
      1   4  7   9
         /  /     \
        3  6      10
    

    这棵树有这些前序和中序遍历:

    • 预购 = 5 2 1 4 3 8 7 6 9 10
    • 中序 = 1 2 3 4 5 6 7 8 9 10

    一些观察:

    • 前序遍历中的第一个值是树的根。在示例中为 5。
    • 如果您在中序遍历中找到该根的位置,那么您知道该位置之前的值表示左子树的中序遍历(在示例中:1 2 3 4) ,并且跟随该位置的值表示右子树的中序遍历(在示例中:6 7 8 9 10
    • 因此我们知道左子树的大小:我们称它为 leftSize(在示例中:4),这意味着在前序遍历中的下一个 leftSize 值(所以在first值之后——也就是根)代表左子树的前序遍历(在例子中:2 1 4 3),其余的值代表右子树的前序遍历(在示例中:8 7 6 9 10)
    • 因此,我们拥有在左子树和右子树上执行相同逻辑所需的所有信息。
    • 为了保证级别顺序,我们应该按照广度优先顺序执行此操作,即我们应该使用 FIFO 队列。

    这是该想法在 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);

    【讨论】:

    • 对此答案有任何反馈吗?
    • 为什么没有反应?
    猜你喜欢
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多