簡體   English   中英

空 output 同時在 Java 中的二叉樹中執行級別順序遍歷

[英]Empty output while performing level order traversal in Binary trees in Java

我想在 Java 的二叉樹中執行級別順序遍歷。 基本上我需要將每個級別的節點值存儲在一個數組列表中,並將這些不同的數組列表存儲在一個數組列表中。 在我的最終 output 中,只顯示了空數組列表。 我無法理解邏輯錯誤。 任何人都可以請指導我。

public class Solution {
        static ArrayList<ArrayList<Integer>> ourList=new ArrayList<>();
        static ArrayList<Integer>ourArray=new ArrayList<>();
        public static void breadth(Node root){
            Queue<Node> ourQueue=new LinkedList<>();
            ourQueue.add(root);
            while(!ourQueue.isEmpty()){
                int size=ourQueue.size();
                for(int i=0;i<size;i++){
                    Node poppedElement=ourQueue.poll();
                    ourArray.add(poppedElement.data);
                    if(poppedElement.left!=null){
                        ourQueue.add(poppedElement.left);
                    }
                    if(poppedElement.right!=null){
                        ourQueue.add(poppedElement.right);
                    }
                }
                ourList.add(ourArray);
                ourArray.clear();
            }
        }
    }

當您想在ourList中收集結果時,您需要創建保存在ourArray中的列表的專用實例。 因此,您應該重新創建它,而不是清除ourArray :而不是

ourArray.clear();

ourArray= new ArrayList<>();

做以下簡短的測試:

    ArrayList<ArrayList<Integer>> ourList=new ArrayList<>();
    ArrayList<Integer>ourArray=new ArrayList<>();
    //add values
    ourArray.add(1);  ourArray.add(2);  ourArray.add(3);  ourArray.add(4);
    ourList.add(ourArray);

    System.out.println(ourList.get(0)); //prints [1, 2, 3, 4]
    ourArray.clear();
    System.out.println(ourList.get(0)); //prints []

原因是ourList包含對列表的引用。 ourArray是對同一個列表的引用,當它被清除時, ourList包含對空列表的引用。

現在測試PHolzwarth提出的解決方案:

    System.out.println(ourList.get(0)); //prints [1, 2, 3, 4]
    ourArray = new ArrayList<>();
    System.out.println(ourList.get(0)); //prints [1, 2, 3, 4]

另一種解決方案是“防御性副本”:

    ourList.add(new ArrayList<>(ourArray)); //add a copy of ourArray

    System.out.println(ourList.get(0)); //prints [1, 2, 3, 4]
    ourArray.clear();
    System.out.println(ourList.get(0)); //prints [1, 2, 3, 4]

暫無
暫無

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

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