繁体   English   中英

试图在Java中的二叉搜索树上实现层序遍历

[英]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);}

在条件下,它声明leftright在您显示的部分中没有定义,但在右侧它读取node.leftnode.right 这是故意的吗? 我希望在 if 条件下也node.leftnode.right

看看这个问题: Level-order tree traversal我相信这和你想要实现的目标是一样的,不是吗? 这是一个非常经典的问题,所以根据我的经验,它之前已经被反复讨论过。

几条评论:

  1. 主要问题是您在比较中使用leftright而不是node.leftnode.right

  2. 要与 null 进行比较,请使用if (var != null) 不要使用equals() 如果一个变量是 null 你不能调用它的方法,因为这会触发NullPointerException s。

  3. 修复代码后,您将永远不会将null插入队列。 您添加的第一个 object 就是this ,它保证不为空,随后您总是在将项目插入队列之前检查 null。 这意味着您的第一次if (node != null)检查是不必要的。

  4. (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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM