如何逐级打印二叉树?面试问题!

时间:2011-04-06 13:26:05

标签: algorithm binary-tree

如何逐级打印二叉树?

这是我今天的面试问题。果然,使用BFS风格肯定会奏效。但是,后续问题是:如何使用常量内存打印树? (因此不能使用队列)

我想过以某种方式将二叉树转换为链表但没有提出具体的解决方案。

有什么建议吗?

由于

3 个答案:

答案 0 :(得分:5)

避免使用额外内存的一种方法(无论如何更多)是在遍历它时操纵树 - 当你向下遍历节点时,你将其指针的副本复制到其中一个子节点,然后反转指回父母。当你走到最底层时,你会按照这些链接回到父母那里,当你走的时候,你会反过来指向孩子们。

当然,这不是整个工作,但它可能是单个“最棘手”的部分。

答案 1 :(得分:3)

延伸Jerry Coffin所说的话,我之前曾问过一个问题,即使用有序遍历做类似的事情。它使用与他解释的相同的逻辑。

在这里查看:

Explain Morris inorder tree traversal without using stacks or recursion

答案 2 :(得分:1)

您可以通过反复执行树的有序遍历,同时仅打印指定级别的节点来执行此操作。但是,这不是严格恒定的内存,因为递归使用调用堆栈。它效率极低。像O(n * 2 ^ n)或其他东西。

printLevel = 1;

while(moreLevels) {

    moreLevels = printLevel(root, 1, printLevel);
    printLevel++;
}

boolean printLevel(Node node, int currentLevel, int printLevel) {

    boolean moreLevels = false;

    if(node == null) {
        return(false);
    }

    else if(currentLevel == printLevel) {
        print the node value;
    }

    else {

        moreLevels |= printLevel(node.leftChild, currentLevel + 1, printLevel);
        moreLevels |= printLevel(node.rightChild, currentLevel + 1, printLevel);
    }

    return(moreLevels);
}
相关问题