2016-03-05 70 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