![](/img/trans.png)
[英]Error implementing Level Order Traversal Binary Search Tree with Java PriorityQueue
[英]Trying to implement level order traversal on a binary search tree in Java
好的,所以我正在尝试创建一个方法,该方法将返回在其节点中携带 int 值的基本二叉搜索树的级别顺序。 我已经弄清楚了大多数其他方法,例如插入、后订购和预订购,但我一直遇到与级别订购方法相同的问题
这是代码:
private DoubleStackQueue<Node> queue = new DoubleStackQueue<Node>();
//this is a queue that uses two stacks, one for the front and one for the back.
//it works just like a queue.
public String levelOrder(){
s = ""; //The s is a private String that is implemented earlier
queue.add(this);
while (!queue.isEmpty())
{
Node node = (Node)queue.remove();
if (!(node.equals(null))) {s += ""+node.getVal();}
if (!(left.equals(null))) {queue.add(node.left);}
if (!(right.equals(null))) {queue.add(node.right);}
}
return s;
}
我遇到的主要问题是,当程序到达叶节点时,它仍然将其子节点添加到队列中,即使没有子节点,只有 null,所以我会得到一个包含两个空值的队列在它的实际项目的前面。 我最初的 if 语句为 (left,= null) 等。 但这也没有用。 我只是想弄清楚如何让程序识别没有孩子的情况? 我需要做什么?
在您的代码中,我可以找到这些行
if (!(left.equals(null))) {queue.add(node.left);}
if (!(right.equals(null))) {queue.add(node.right);}
在条件下,它声明left
和right
在您显示的部分中没有定义,但在右侧它读取node.left
和node.right
。 这是故意的吗? 我希望在 if 条件下也node.left
和node.right
。
看看这个问题: Level-order tree traversal我相信这和你想要实现的目标是一样的,不是吗? 这是一个非常经典的问题,所以根据我的经验,它之前已经被反复讨论过。
几条评论:
主要问题是您在比较中使用left
和right
而不是node.left
和node.right
。
要与 null 进行比较,请使用if (var != null)
。 不要使用equals()
。 如果一个变量是 null 你不能调用它的方法,因为这会触发NullPointerException
s。
修复代码后,您将永远不会将null
插入队列。 您添加的第一个 object 就是this
,它保证不为空,随后您总是在将项目插入队列之前检查 null。 这意味着您的第一次if (node != null)
检查是不必要的。
(Node) queue.remove()
中的强制转换应该是不必要的。 你的编译器应该警告你这一点。
结果:
queue.add(this);
while (!queue.isEmpty())
{
Node node = queue.remove();
s += "" + node.getVal();
if (node.left != null) { queue.add(node.left); }
if (node.right != null) { queue.add(node.right); }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.