我有一個任務,我需要一些方法的幫助。二叉樹,返回預先遍歷中的下一個節點
所以我有這樣的樹:
A
/ \
B C
/ \/ \
D E F G
/ \
H I
/ \
J K
,我的方法是:
public BinaryTree preorderNext(BinaryTree t, BinaryTree v, BinaryTree prev) {
prev = t;
if(t.getLeft() != null) {
preorderNext(t.getLeft(), v, prev);
}
if(t.getRight() != null) {
preorderNext(t.getRight(), v, prev);
}
if(prev == v) {
return t;
}
return null;
}
講師給了一個簡單的實現樹。這個類被稱爲BinaryTree,如果你想建立一個到它的節點鏈接,那麼你可以指定左邊和右邊的BinaryTree節點是什麼。
一個節點有兩個鏈接(一個到左邊,另一個到右邊的孩子),沒有鏈接到頭部。
因此,使用當前的方法,我能夠成功地進行預遍歷,我通過編寫存儲在節點的元素的打印語句來測試。
但是當我運行測試時,它告訴我A的下一個前序節點是B,K的下一個前序節點會拋出一個空異常,但它應該是I?
任何想法,我哪裏去錯了?變量prev應該保存對訪問的最後一個節點的引用,所以如果它等於節點v(這是我指定的節點,在v之後返回節點),我不應該得到下一個節點嗎?
你能修改函數簽名嗎?處理'root'比't','v'和'prev'要容易得多。這是因爲樹的每個孩子本身也是一棵樹。 – arin 2013-03-04 17:09:02
你是什麼意思? t是我可以通過的樹的根。 – tenkii 2013-03-04 17:12:06
您應該持有遞歸方法,而不是將先前訪問過的信息再次傳遞給該方法;這些信息已經在堆棧中。我將發佈一個答案來解釋我的前序遍歷的方法。 – arin 2013-03-04 17:16:06