如何逐级打印二叉树?
这是我今天的面试问题。果然,使用BFS风格肯定会奏效。但是,后续问题是:如何使用常量内存打印树? (因此不能使用队列)
我想过以某种方式将二叉树转换为链表但没有提出具体的解决方案。
有什么建议吗?
由于
答案 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);
}