[英]Print level order traversal of binary tree, from left to right and right to left alternately
這是一個面試問題。
我們希望按級別打印二叉樹,但要進行一些更改:
在偶數級別上,打印將從左到右。
在奇數級別,打印將從右到左。
我嘗試在此處使用代碼(正常級別順序遍歷,方法2),僅作了一些更改,以保持級別(知道是從左向右還是從右向左打印),當然還添加了相關的打印條件正確的方向。
不幸的是,下面的代碼在不小的樹上不能很好地工作-我在理解如何在循環中按正確順序存儲節點方面存在問題。 請告訴我該如何解決:
輔助類:
public class Node {
int data;
Node left, right;
public Node(int item) {
data = item;
left = null;
right = null;
}
}
主班:
public class BinaryTree {
class LevelNode {
int level;
Node node;
public LevelNode(int level, Node node) {
this.level = level;
this.node = node;
}
};
private Node root;
void printLevelOrder(){
int level = 0;
Queue<LevelNode> queue = new LinkedList<LevelNode>();
queue.add(new LevelNode(level, root));
while (!queue.isEmpty()){
LevelNode tempNode = queue.poll();
level = tempNode.level;
System.out.print(tempNode.node.data + " ");
if ( (level & 1) == 1 ) {
if (tempNode.node.left != null) {
queue.add(new LevelNode(level + 1, tempNode.node.left));
}
if (tempNode.node.right != null) {
queue.add(new LevelNode(level + 1, tempNode.node.right));
}
}
else {
if (tempNode.node.right != null) {
queue.add(new LevelNode(level + 1, tempNode.node.right));
}
if (tempNode.node.left != null) {
queue.add(new LevelNode(level + 1, tempNode.node.left));
}
}
}
}
}
對於上面的示例,我的代碼顯示為: 1 3 2 7 4
這是生成輸出的主要方法:
public static void main (String[] args) {
BinaryTree tree_level = new BinaryTree();
tree_level.root = new Node(1);
tree_level.root.left = new Node(2);
tree_level.root.right = new Node(3);
tree_level.root.left.left = new Node(4);
tree_level.root.right.right = new Node(7);
tree_level.printLevelOrder();
}
我認為逐步完成任務應該比較容易,即
在這種情況下,您不需要LevelNode
類來存儲級別,因為在處理級別時該級別是已知的。
void printLevelOrderFixed() {
List<Node> currLevel = new ArrayList<>();
currLevel.add(root);
int level = 1;
while(currLevel.size() > 0) {
// Output
currLevel.forEach(x -> System.out.print(x + " "));
// Preparation for next level
List<Node> nextLevel = new ArrayList<>();
for (int i = currLevel.size() - 1; i >= 0; i--) {
Node left = currLevel.get(i).left;
Node right = currLevel.get(i).right;
if (level % 2 == 0) {
if (left != null) nextLevel.add(left);
if (right != null) nextLevel.add(right);
} else {
if (right != null) nextLevel.add(right);
if (left != null) nextLevel.add(left);
}
}
currLevel.clear();
currLevel.addAll(nextLevel);
level++;
}
System.out.println("");
}
使用您的結果和固定結果擴展測試驅動程序:
public static void main(String[] args) {
System.out.println("Example 1. Expected output: 1 3 2 4 7 ");
BinaryTree tree_level = new BinaryTree();
tree_level.root = new Node(1);
tree_level.root.left = new Node(2);
tree_level.root.right = new Node(3);
tree_level.root.left.left = new Node(4);
tree_level.root.right.right = new Node(7);
tree_level.printLevelOrder();
System.out.println();
tree_level.printLevelOrderFixed();
System.out.println();
System.out.println("Example 2. Expected output: 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 ");
/* 1
* 3 2
* 4 5 6 7
* 5 4 3 2 1 0 9 8
* 6 7
* 9 8
*/
BinaryTree tree_level2 = new BinaryTree();
tree_level2.root = new Node(1);
tree_level2.root.left = new Node(3);
tree_level2.root.right = new Node(2);
tree_level2.root.left.left = new Node(4);
tree_level2.root.left.right = new Node(5);
tree_level2.root.right.left = new Node(6);
tree_level2.root.right.right = new Node(7);
tree_level2.root.left.left.left = new Node(5);
tree_level2.root.left.left.right = new Node(4);
tree_level2.root.left.right.left = new Node(3);
tree_level2.root.left.right.right = new Node(2);
tree_level2.root.right.left.left = new Node(1);
tree_level2.root.right.left.right = new Node(0);
tree_level2.root.right.right.left = new Node(9);
tree_level2.root.right.right.right = new Node(8);
tree_level2.root.left.left.left.left = new Node(6);
tree_level2.root.right.right.right.right = new Node(7);
tree_level2.root.left.left.left.left.left = new Node(9);
tree_level2.root.right.right.right.right.right = new Node(8);
tree_level2.printLevelOrder();
System.out.println();
tree_level2.printLevelOrderFixed();
System.out.println();
}
測試驅動程序的輸出:
Example 1. Expected output: 1 3 2 4 7
1 3 2 7 4
1 3 2 4 7
Example 2. Expected output: 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
1 2 3 6 7 4 5 0 1 8 9 4 5 2 3 7 6 8 9
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.