簡體   English   中英

二叉樹遞歸 removeLeftmost() 方法如何工作?

[英]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的新的左樹8left = 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.

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