这是一个面试问题。
我们希望按it级别打印二叉树,但有一些变化:
在偶数级别,打印将从左到右。
在奇数级别,打印将从右到左。
我试着使用这里的代码(正常的级别顺序遍历,方法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
我想从右到左遍历一个二叉树,并将每个具有相同姓氏的条目添加到一个队列中。我已经正确地实现了一个队列列表类和一个树节点类,但是当我试图查找一些东西时,我得到了一个空指针异常。(当然我写过二叉树的插入方法)。
通常我们按顺序、前顺序或后顺序遍历二叉搜索树。但是,当我们按照从右到根到左的递归顺序遍历二叉搜索树时,会发生什么呢? 假设如果我将值存储在数组中,并且与前序遍历相比,当我们按此顺序遍历时,它的时间复杂度是否会增加。
我正在尝试对二叉树进行级别顺序遍历。但诀窍是代替正常的级别顺序遍历,我想做另一种选择。对于例如。 普通等级顺序遍历 : 我要找的是我们打印根。现在,对于每一个偶数级,我都想逆时针旋转,对于每奇数级,都会顺时针旋转: 对于这种遍历,输出应该是: 这是我到目前为止尝试的,但这产生的输出与我试图实现的输出略有不同: 该程序产生以下输出: < code>1 3 2 5 4 7 6 10 11 9 8 我需
我正在尝试制作计算器,但我对JTextField有一个问题。当我点击数字(JButtons),比如1,2,3,4,5,它们就会出现在JTextField上,比如54321。那么,我怎样才能把它改成12345而不是54321呢?
我读过segues上的其他帖子,但没有一篇能解决我的问题。 简单地说,我的ViewController就像一本书一样被订购。我希望从左到右的向后过渡(例如:从第9页到第8页)始终存在(滑动)。我想从右到左向前过渡(从第9页到第10页)。 是的,如果您一页接一页地分页,我的导航控制器后退按钮(左上角)会显示为这样。但是,如果您从索引跳入,那么导航控制器上的后退功能会将您带回索引。 我的目标是,如果用
如您所见,GravityCompat不允许我放右而不是结束或开始,如果我把它放入XML中,它就会崩溃。 出现下一个错误: