[英]How does binary tree recursive removeLeftmost() method work?
該方法的規范聲稱該方法從根開始,將刪除最左邊的節點並修復樹結構。 它還說,如果最左邊的節點沒有左子節點將右子節點(可能為null
)附加到最左邊節點的父節點作為左子節點(我在代碼中看不到這種情況發生的位置)。 這是代碼:
public BTNode removeLeftmost()
{
if (left == null)
return right;
left = left.removeLeftmost();
return this;
}
我只是不明白它是如何用最左邊的節點返回整棵樹的。 主要是第一部分讓我感到困惑,它說如果left == null
則返回右孩子。 如果我深入到樹中(由於遞歸調用),返回時會不會切斷很多樹?
我假設這是一個二叉搜索樹,因為否則你不需要修復結構,對嗎?
所以它所做的是沿着樹移動直到左邊沒有更多的分支,即僅相對於左邊,你已經到達了一片葉子。
if (left !=null){ left = left.removeLeftmost(); }
此時,它將子節點右側的分支left = left.removeLeftmost();
到左側樹所在的父節點上的那個位置left = left.removeLeftmost();
再次通過left = left.removeLeftmost();
),然后它會返回之前在子節點中的分支一直到樹根的同一地點。
這是它處理的情況:
9
/ \
8 12
/ \
5 20
\
6
\
7
當我們到達5
,它是最左邊的節點( left == null
)。 我們需要刪除它。 這樣的權5
(即6
)被返回給調用者( return right;
),和呼叫方使6
的新的左樹8
( left = left.removeLeftmost()
)..
9
/ \
8 12
/ \
6 20
\
7
然后8
返回給調用者( return this
)並分配為9
的左節點( left = left.removeLeftmost()
)。 但是8
已經是9
的左孩子,所以這不會改變任何東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.