![](/img/trans.png)
[英]How to write a double value in a file, without knowing its precision ofstream
[英]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
?
我想到了三種方法:
讓rotate_left()
引用指向節點N
指針
void rotate_left(Node * &node);
然后調用rotate left()
,向其傳遞P
的右子P
(即N
):
rotate_left(P->right_child);
旋轉結束時將對象R
放在N
的存儲地址下
將父級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.