[英]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.