簡體   English   中英

使用兩個隊列的層序遍歷二叉樹

[英]Level order traversal binary tree using two queues

Leetcode 問題: https ://leetcode.com/problems/binary-tree-level-order-traversal/

我有兩個隊列,我清空我的第一個隊列 (q),同時將元素添加到我的第二個隊列 (q2),這樣我就可以獲得級別。 當第一個隊列為空時,我將它傳遞給函數以創建該級別的 ArrayList 並添加到我的結果值中,如果 q2 為空,則意味着沒有添加任何內容,因此我們可以跳出循環並返回該函數. 我必須手動添加第一個節點。 問題是只添加了中間級別,而不是其他級別。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        if(root == null) {
            return null;
        }
        
        List<List<Integer>> returnList = new ArrayList<>();
        Queue<TreeNode> q = new LinkedList<>();
        q.add(root);
        List<Integer> tempList = new ArrayList<>();
        tempList.add(root.val);
        returnList.add(tempList);
        
        while(true) {
            Queue<TreeNode> q2 = new LinkedList<>();
            while(!q.isEmpty()) {
                TreeNode node = q.remove();
           
                if(node.left != null) {
                    q2.add(node.left);
                }
                if(node.right != null) {
                    q2.add(node.right); 
                }
            }
            
            if(q2.isEmpty()) {
                break;
            }
  
            q = q2;
            addList(returnList, q2);
       
        }
        return returnList;
    }
    
    public static void addList(List<List<Integer>> returnList, Queue<TreeNode> q2) {
        List<Integer> tempList = new ArrayList<>();
        int size = q2.size();
        for(int i = 0; i < size; i++) {
            int val = q2.remove().val;
            System.out.println(val);
            tempList.add(val);
        }
        returnList.add(tempList);
    }
}

問題與這部分代碼有關:

    q = q2;
    addList(returnList, q2);

函數addList將清空給定的隊列q2 ,對其調用remove 由於q已成為對同一隊列的引用,您已清空q ,因此外循環的下一次迭代將不會進入內循環,並以break退出外循環。

為了避免這種情況發生,請確保沒有在q執行remove調用:制作一個副本:

    q = new LinkedList<>(q2);
    addList(returnList, q2);

或者,或者:

    q = q2;
    addList(returnList, new LinkedList<>(q2));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM