システムスタックバイナリツリーの再帰呼び出し

フィボナッチのための非常に重要な概念でコンピュータサイエンスの再帰種類の比較的単純な再帰的な分析が容易になりますが、原因バイナリツリーにポインタ操作を必要とするため、システム・スタックの場合トラバーサルを模倣します。
実証するためのバイナリツリートラバーサルシーケンス例:

//二叉树定义
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)は、スタックにプッシュされている。
ここに画像を挿入説明
この場合、if83ラインの実行、保持していない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、右の子が空である、それは、戻され、アンスタックさがroot4をリダイレクト、この時点でライン80が終了し、全体のif完成し、リターンをseq、スタックを終了root戻ります2の完成前順で、2ルートとするサブツリー、システムスタック:
ここに画像を挿入説明
継続 、戻りライン78、root点1は、配列番号1に、というように、シーケンス全体を横断することができます。

キーは、次のとおりです。再帰呼び出しの理由inOrder、再帰的に現在の合流点圧力にアクセスすることを望んでいないことで今、(最初の左端のノードを見つけ、シーケンスのために)現在のノードにアクセスすることを望んでいないので、システムスタックした後、ノードがアクセスしたい、とスタック解除操作が親ノードを返す使用してアクセス見つけます。

おすすめ

転載: www.cnblogs.com/EIMadrigal/p/11520701.html