簡體   English   中英

使用廣度優先遍歷算法,我以連續順序將項目添加到二叉樹中,但是它們沒有正確添加

[英]Using the Breadth-first traversal algorithm, I'm adding items to a Binary Tree in consecutive order, but they're not adding properly

我使用以下方法(使用廣度優先遍歷算法)以連續順序將項目添加到二叉樹中。

例如,如果我有

  A
 / \
 B  C
/  
D 

我希望下一個添加項是:

  A
 / \
 B  C
/ \ 
D  E

我的問題在於我不確定如何正確返回該值。 我知道,當我們遇到第一個空節點時,就是在其中插入值,但是將其插入什么位置呢? 如果將其插入到從隊列中獲取的二叉樹中,那將是根的子樹(或我們要添加到的樹),因此返回的樹將不是完整的樹。

這是我的代碼:

public static <T> BinaryTree<T> addToTree(BinaryTree<T> t1, BinaryTree<T> t2) {
    Queue<BinaryTree<T>> treeQueue = new LinkedList<BinaryTree<T>>();

    while (t1 != null) {
        if (t1.getLeft() == null) {
            t1.attachLeft(t2);
            break;
        }
        treeQueue.add(t1.getLeft());

        if (t1.getRight() == null) {
            t1.attachRight(t2);
            break;
        }
        treeQueue.add(t1.getRight());

        if (!treeQueue.isEmpty()) t1 = treeQueue.remove();
        else t1 = null;
    }
    return t1;
}

好的,我想我現在能滿足您的要求。

您的廣度優先實現是正確的。

二叉樹是一種“自包含”的結構。 您從稱為A的根開始,對兩個其他二叉樹(“ left”和“ right”)的兩個引用

您從開始:

    A
   / \
  B  C
 /  
D 

並添加一個二叉樹E作為B的右子樹:

  A
 / \
 B  C
/ \ 
D  E

您的實現按原樣返回子樹“ B”,新子樹已附加在該子樹上。 我不確定您使用的是哪種BinaryTree實現,但是我希望:

"B".attachRight("E");

修改原始樹,因此附加節點的“新”樹仍然是以“ A”開頭的樹-即,您不必返回任何內容! 我不知道您的實現是否跟蹤“父級”,如果是,您可以遍歷父級層次結構,從“ B”開始,直到找到父級為空的節點-根(再次為“ a”)

調用addToTree(BinaryTree t1,BinaryTree t2)后,您想要的答案是“ t1”,這是您作為第一個參數傳遞的“ A”根樹。

您的問題在這里:

如果(!treeQueue.isEmpty())t1 = treeQueue.remove(); 否則t1 = null;

如果節點沒有子節點,則可以將其引用設置為null來中斷while,但這也是函數返回的值。 您可以只使用一個臨時變量來存儲對要返回的節點的引用。

暫無
暫無

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

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