私はこの問題に直面して、正しい解決策を考え出すことができたかどうか疑問に思っていました。この問題は、バイナリツリーの2つのノードを値だけでなくノードによってスワップすることに関係します。つまり、左右の値を変更する必要があります。ツリー2つのノードを交換するためのトラバーサル
だから我々は、上記の画像のようなバイナリツリー何かを持っていることを言うことができます。私が最初に思ったのは、ノードのインオーダートラバーサルを作成し、ツリーを平坦化して要素を交換し、スワップされたリストからツリーを再構築できるようにすることでした。だから、文字通りソリューションは、上記のツリーでは、これ
のようなものになり、inorderをトラバーサルはこの、
1,3,4,6,7,8,10,13,14のようなリストが生成されます。
今、私は8と13
=> 1,3,4,6,7,13,10,8,14
を入れ替えるしかし、私は木を平坦化されているので、ここでの問題は、あります今私が再構築しようとすると、特定のノードが左のサブファイルであるか、ルートであるかなど、個々のノードの位置がわからないため、私はそうすることができません。だから、文字通り、ツリーは、スワップされたノードで最初と同じように再生成することはできません。
ここで問題になるのは、各ノードの位置情報を保持するトラバーサルアルゴリズムを変更して、要素をスワップして再構築するときに、スワップされるノードが同じバイナリツリーになるかどうかです。インオーダートラバーサル中に個々のノードの状態/位置を保存できますか?
PS。ポストオーダーを実行すると、最初と最後のノードのリストがスワップされることになりますが、スワップする必要がある2つのノードは、必ずしもルートと最も右の要素にある必要はありません。
はい私がここに示したツリーはBSTですが、私はそれが単なるバイナリツリーであることを言いました。だから、BSTはケースかもしれないが、それだけではない。両方のトラバースの使用に関して、私はそれについて考えましたが、平らにするためのトラバースとバイナリツリーを再構築するためのトラバースのいずれかをやり直すときに、再構築が同じバイナリツリーを生成するために再びどのように行われるのでしょうか?あなたは例を挙げることができますか? – Ajai