簡體   English   中英

如何在不知道其父級的情況下旋轉子樹

[英]How to rotate a subtree without knowing its parent

我想向左旋轉以節點N根的子樹(請參見左圖),而無需操縱其父P

P             P              P   
 \            |               \
  N           | R              R
 / \          |/              /
L   R         N              N
             /              /
            L              L

如果我願意在函數中使用N作為參數:

void rotate_left(Node *node);

我最后將在中間的圖上顯示一棵樹。 問題是盡管旋轉P仍指向N ,而不指向R (左圖)。 如果函數rotate_left()沒有指向P的指針,如何使P在旋轉結束時指向R

我想到了三種方法:

  1. rotate_left()引用指向節點N指針

     void rotate_left(Node * &node); 

    然后調用rotate left() ,向其傳遞P的右子P (即N ):

     rotate_left(P->right_child); 
  2. 旋轉結束時將對象R放在N的存儲地址下

  3. 將父級P傳遞給rotate_left()

     void rotate_left(Node *parent, Node *child); 

解決方案(2)和(3)聽起來不太好,在解決方案(1)中,您需要在調用rotate_left()函數中知道父P

解決方案1是您建議的三種方法中最好的一種。 它或多或少地等同於解決方案3。我會用它。 在我看來,無論您在哪里調用rotate_left您都已經知道存儲該指針的變量(父節點或root ),因此傳遞其引用將不是問題。

解決方案2(交換內容)將使樹外已經存在的所有指針無效。 您必須非常小心; 如果有這樣的指針,請不要使用它。 但是,這是對您的問題“不知道父母該如何旋轉?”的唯一真實答案。

我想您不想在樹中保留指向父節點的指針。 如果您准備這樣做,那么一切都會變得容易得多。

暫無
暫無

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

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