この問題に遭遇したばかりで、正しい解決策を思いつくことができるかどうか疑問に思っていました. この問題は、バイナリ ツリーの 2 つのノードを値だけでなくノードごとに交換することに関係しています。つまり、左右の値も変更する必要があります。
上の画像のような二分木があるとしましょう。私が最初に考えたのは、ツリーを平坦化し、要素を交換して、交換されたリストからツリーを再構築できるように、ノードの順序通りのトラバーサルを行うことでした。文字通り、解決策は次のようになります
上記のツリーの場合、インオーダー トラバーサルは次のようなリストを生成します。
1,3,4,6,7,8,10,13,14.
今度は 8 と 13 を交換します。
=> 1,3,4,6,7,13,10,8,14
しかし、ここでの問題は、特定のノードが左のサブチャイルドであるかどうか、またはそれがルート。したがって、文字通り、スワップされたノードを使用した最初と同じようにツリーを再生成することはできません。
問題は、各ノードの位置情報を保持するようにトラバーサル アルゴリズムを変更して、要素を交換して再構築するときに、目的のノードが交換された同じバイナリ ツリーを作成できるかどうかです。順序通りのトラバーサル中に個々のノードの状態/位置を保存できますか?
PS。ポストオーダーを行うと、最初と最後のノードがスワップされるリストが作成されることを認識していますが、スワップする必要がある 2 つのノードは、必ずしもルートと右端の要素にある必要はなく、任意の 2 つにすることができます。