この領域での多くの研究はドームであり、ガベージコレクションのコンテキストでツリーと一般的なリスト構造を「安く」トラバースする方法に動機付けられています。
スレッド化されたバイナリツリーは、ツリー内の後続ノードへのリンクにいくつかのnilポインタが使用されるバイナリツリーの適応表現です。この追加情報を使用して、スタックなしでツリーを走査できます。ただし、スレッドを子ポインターと区別するには、ノードごとに余分なビットが必要です。ウィキペディア:Tree_traversal
私の知る限り、通常の方法(ノードごとの左右のポインター)でポインターを使用して実装されたバイナリツリーは、Morrisに帰属するメソッドでスレッドのメソッドを使用して走査できます。NILポインターは一時的に再利用され、パスをルートに戻します。賢い部分は、トラバーサル中に、元のエッジと一時的なスレッドリンクを区別できることです(ツリー内でサイクルを形成する方法を使用)。
良い部分:追加のデータ構造はありません。悪い部分:わずかに不正行為。スタックは巧妙な方法でツリー内にあります。非常に賢い。
P. MatetiおよびR. Manghirmalani:Morris's Tree Traversal Algorithm Reconsidered DOI:10.1016 / 0167-6423(88)90063-9に、隠されたスタックの証明が示されています。
JM Morris:二分木を簡単かつ安価にたどります。IPL 9(1979)197-200 DOI:10.1016 / 0020-0190(79)90068-1
次に、Lindstromスキャンもあります。このメソッドは、各ノードに関連する3つのポインター(親と2つの子)を「回転」させます。適切な事前注文または事後注文アルゴリズムを実行する場合、ノードごとに追加のビットが必要です。すべてのノードにアクセスしたい場合(3回ですが、どの訪問を実行したかわからない場合)、ビットなしで実行できます。
G. Lindstrom:スタックやタグビットのないリスト構造をスキャンします。IPL 2(1973)47-51。DOI:10.1016 / 0020-0190(73)90012-4
おそらく最も簡単な方法は、ロブソンによる方法です。ここでは、古典的なアルゴリズムに必要なスタックがリーフに通されています。
JM Robson:補助スタックIPL 1(1973)149-152なしで二分木を横断するための改善されたアルゴリズム。10.1016 / 0020-0190(73)90018-5
IPL =情報処理レター