フィボナッチのための非常に重要な概念でコンピュータサイエンスの再帰種類の比較的単純な再帰的な分析が容易になりますが、原因バイナリツリーにポインタ操作を必要とするため、システム・スタックの場合トラバーサルを模倣します。
実証するためのバイナリツリートラバーサルシーケンス例:
//二叉树定义
struct TreeNode {
TreeNode* left;
TreeNode* right;
int val;
TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};
:の再帰トラバーサル順序
示すようにバイナリツリーを仮定:
前記シーケンスの先行順\(2413 \)、VS対応する変数によって追跡する方法のステップができる:
場合root==NULL(root指向2的左孩子)
、その時点で、システムスタック(予約購入は左の子にアクセスする必要があるため、図1および図2)は、スタックにプッシュされている。
この場合、if
83ラインの実行、保持していないreturn
この時点で、バックライン78に、デ積層、ステートメントroot指向2(因为此时程序已经来到了新的栈顶),并且向这个新栈顶返回了一个空的seq
:
これがオンになっているので、次に79行を(実行しますこの関数はreturn
、それが2に、再びライン78)を実行しないであろうseq
と、
ライン80(実行root
点4)、それによってライン78を実行するために、root
この時点で、システム・スタックを左の子の点4(参照、それは明らかですスタックの底部を順次積層する電流ルートを格納するroot
ノードのパス)上の接合:
同様の実装return
ステートメントは、脱積層、seq
(バックのみ2)この層に戻すには、この層のroot
点4、図4に示すように堆積されるseq
、
呼び出すために、80行目にinOrder()
するように、root
右の子点4、右の子が空である、それは、戻され、アンスタックさがroot
4をリダイレクト、この時点でライン80が終了し、全体のif
完成し、リターンをseq
、スタックを終了root
戻ります2の完成前順で、2ルートとするサブツリー、システムスタック:
継続 、戻りライン78、root
点1は、配列番号1に、というように、シーケンス全体を横断することができます。
キーは、次のとおりです。再帰呼び出しの理由inOrder
、再帰的に現在の合流点圧力にアクセスすることを望んでいないことで今、(最初の左端のノードを見つけ、シーケンスのために)現在のノードにアクセスすることを望んでいないので、システムスタックした後、ノードがアクセスしたい、とスタック解除操作が親ノードを返す使用してアクセス見つけます。