2016-03-05 54 views
1

如何修复这个LevelOrder遍历?错误的LevelOrder遍历

public static void LevelOrder(TreeNode root){ 
     Queue <TreeNode> q = new LinkedList <>(); 
     TreeNode tmp=root; 
     q.add(tmp); 
     while (!q.isEmpty()) { 
      System.out.print(q.remove().data + " "); 
      if (tmp.left!=null) { 
       q.add(tmp.left); 
      } 
      if (tmp.left!=null) { 
       q.add(tmp.right); 
      } 
       tmp = q.peek(); 
     } 

    } 
+0

为什么在队列中添加tmp.right元素时检查temp.left!= null? – attaboy182

回答

1

不仅仅是remove()从队列中不存储。将它保存在一个变量中,因为您需要它来检查左侧和右侧。你也没有检查是否rootnull。一个可能的修复这两个问题:

public static void LevelOrder(TreeNode root) { 
    Queue<TreeNode> q = new LinkedList<>(); 
    q.add(root); 
    while (!q.isEmpty()) { 
     TreeNode tmp = q.remove(); 
     if (tmp == null) { 
      continue; 
     } 
     System.out.print(tmp.data + " "); 
     q.add(tmp.left); 
     q.add(tmp.right); 
    } 
} 

相反的remove(),我建议使用poll()。不同的是,remove()将在队列为空时抛出异常。但由于环路条件,我们知道不能发生。有关LinkedList的各种方法的更多详细信息,请参阅JavaDoc

+0

难道我们不能以只使用peek,删除和添加队列功能的方式编写它吗?谢谢! –

+0

你的答案也可以。我愿意看到有人提供了一个让我更容易理解的答案。你往往是在高级结束:) –

+1

我澄清了一点'轮询'与'删除',看到我更新的职位。这里不需要'peek','remove/poll'和'add'就足够了。 – janos