是否可以使用深度优先遍历在单独的行上打印二叉树的每一层?
Is it possible to print each level of a binary tree on a separate line using depth-first traversal?
我熟悉使用队列在 O(n)
时间内在单独的行中打印每个级别。我想知道是否有任何方法可以使用预序、中序或 post 序遍历来执行此操作。我有以下代码,但我不知道如何处理 depth
参数。我唯一的想法是在遍历树时使用一个链表数组来存储所有节点,消耗 O(n)
额外 space。有没有更好的方法来做到这一点?
class Node {
int key;
Node left;
Node right;
Node(int value) {
key = value;
left = null;
right = null;
}
}
public class bst {
private Node root;
bst() {
root = null;
}
private void printTreeRec(Node root, int depth) {
if(root != null) {
System.out.println(root.key);
printTreeRec(root.left, depth + 1);
printTreeRec(root.right, depth + 1);
}
}
void printTree() {
printTreeRec(root, 0);
}
public static void main(String[] Args) {
bst tree = new bst();
tree.insert(25);
tree.insert(15);
tree.insert(35);
tree.insert(7);
tree.insert(18);
tree.insert(33);
tree.insert(36);
tree.printTree();
}
}
确实不可能使用上述方法,因为它们会 depth-first
也就是说,它们总是朝着一个方向前进,直到到达分支的尽头。
或者至少不是在算法执行时直接在控制台上打印输出。
这不是一个严格的证明,但它应该描述问题:
预购
System.out.println(root.key);
printTreeRec(root.left, depth + 1);
printTreeRec(root.right, depth + 1);
在特定节点,您首先打印当前节点。然后,你向左走,打印那个节点,依此类推。由于您已经向下移动了控制台,并且您不能返回,这种方法将不起作用
顺序
printTreeRec(root.left, depth + 1);
System.out.println(root.key);
printTreeRec(root.right, depth + 1);
在这种情况下,您从根开始,然后向左走。仍然离开,直到没有更多的子节点。然后你打印。但是现在您将上树,您将如何处理控制台行上的焦点?你必须再次前进。在这种情况下也不可能。
后序
printTreeRec(root.left, depth + 1);
printTreeRec(root.right, depth + 1);
System.out.println(root.key);
在这种情况下,您从根开始,然后向左走。直到你可以。当你做不到的时候,你就开始做对了。一直往右走,直到你可以。然后开始打印。但是现在,与上面类似,你将上树,你将如何处理控制台行上的焦点?你必须再次前进。不可能了。
我们如何让它发挥作用?
我们应该作弊,并传递一个级别变量来了解我们在特定时刻所处的级别。填充一个数据结构,如地图,将包含每个级别的节点值,算法完成计算后,打印结果,每行一个级别,使用地图。
您可以在此处参考讨论:Java DFS solution。 Post 为了方便起见,下面的代码。
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
levelHelper(res, root, 0);
return res;
}
public void levelHelper(List<List<Integer>> res, TreeNode root, int height) {
if (root == null) return;
if (height >= res.size()) {
res.add(new LinkedList<Integer>());
}
res.get(height).add(root.val);
levelHelper(res, root.left, height+1);
levelHelper(res, root.right, height+1);
}
我熟悉使用队列在 O(n)
时间内在单独的行中打印每个级别。我想知道是否有任何方法可以使用预序、中序或 post 序遍历来执行此操作。我有以下代码,但我不知道如何处理 depth
参数。我唯一的想法是在遍历树时使用一个链表数组来存储所有节点,消耗 O(n)
额外 space。有没有更好的方法来做到这一点?
class Node {
int key;
Node left;
Node right;
Node(int value) {
key = value;
left = null;
right = null;
}
}
public class bst {
private Node root;
bst() {
root = null;
}
private void printTreeRec(Node root, int depth) {
if(root != null) {
System.out.println(root.key);
printTreeRec(root.left, depth + 1);
printTreeRec(root.right, depth + 1);
}
}
void printTree() {
printTreeRec(root, 0);
}
public static void main(String[] Args) {
bst tree = new bst();
tree.insert(25);
tree.insert(15);
tree.insert(35);
tree.insert(7);
tree.insert(18);
tree.insert(33);
tree.insert(36);
tree.printTree();
}
}
确实不可能使用上述方法,因为它们会 depth-first
也就是说,它们总是朝着一个方向前进,直到到达分支的尽头。
或者至少不是在算法执行时直接在控制台上打印输出。
这不是一个严格的证明,但它应该描述问题:
预购
System.out.println(root.key);
printTreeRec(root.left, depth + 1);
printTreeRec(root.right, depth + 1);
在特定节点,您首先打印当前节点。然后,你向左走,打印那个节点,依此类推。由于您已经向下移动了控制台,并且您不能返回,这种方法将不起作用
顺序
printTreeRec(root.left, depth + 1);
System.out.println(root.key);
printTreeRec(root.right, depth + 1);
在这种情况下,您从根开始,然后向左走。仍然离开,直到没有更多的子节点。然后你打印。但是现在您将上树,您将如何处理控制台行上的焦点?你必须再次前进。在这种情况下也不可能。
后序
printTreeRec(root.left, depth + 1);
printTreeRec(root.right, depth + 1);
System.out.println(root.key);
在这种情况下,您从根开始,然后向左走。直到你可以。当你做不到的时候,你就开始做对了。一直往右走,直到你可以。然后开始打印。但是现在,与上面类似,你将上树,你将如何处理控制台行上的焦点?你必须再次前进。不可能了。
我们如何让它发挥作用?
我们应该作弊,并传递一个级别变量来了解我们在特定时刻所处的级别。填充一个数据结构,如地图,将包含每个级别的节点值,算法完成计算后,打印结果,每行一个级别,使用地图。
您可以在此处参考讨论:Java DFS solution。 Post 为了方便起见,下面的代码。
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
levelHelper(res, root, 0);
return res;
}
public void levelHelper(List<List<Integer>> res, TreeNode root, int height) {
if (root == null) return;
if (height >= res.size()) {
res.add(new LinkedList<Integer>());
}
res.get(height).add(root.val);
levelHelper(res, root.left, height+1);
levelHelper(res, root.right, height+1);
}