Cデータ構造とアルゴリズム - ベースの仕上げ - 木04:回路図 - 先行順木

图解树的中序遍历递归执行过程

この章は、次のセクションに基づいています。

Cデータ構造とアルゴリズム - 連結の基礎 - 木02:バイナリツリートラバーサルの確立と異なります

Cデータ構造とアルゴリズム - 連結の基礎 - 木03:回路図 - 順トラバーサル、再帰的の原則の深い理解を通じて

この章を理解した後も参照してください:

Cデータ構造及びアルゴリズム - ベースの仕上げ - ツリー05:回路図 - ツリーの順序トラバーサル

グラフィカル関数のトラバーサル順序どおり再帰的に

コードは以下の通りであります:

//中序遍历,递归实现
void InorderTraversal(BinTree BT)
{
    if (BT == NULL) return;
    InorderTraversal(BT->Left);
    printf(" %c", BT->data);
    InorderTraversal(BT->Right);
    return;
}

再帰的プロセス図:

元のバイナリツリー:

ルートノードが空ではないので1.最初のステップは、BT->は左空ではないので、第2のステップは、コールを(この場合はノードBの位置、開始しかし、InorderTraversal(BT->左)開始、InorderTraversalを呼び出しいいえ印刷)は、この場合、(第3ステップと、ノードDの位置を始め、InorderTraversal(BT->左)を開始しないではなく、印刷された)、)InorderTraversal(BT->左始め、第四のステップで始まります開始InorderTraversal(BT->左)(現在ノードHが、印刷されない位置で)、BT->左空にこの時間は、Hノードの印刷、書類を印刷する第四のステップを行い、続いてすぐに戻り、ノードHの完全なトラバーサル (図中のコールの数のステップ数を表します)

2.第四段階のprint文が終了し、開始InorderTraversal(BT->右)、BT->は右が空で、そしてすぐに終了する第四の工程に戻り、第三段階への復帰は、第3のステップは、結び目を印刷し始めましたD、ノードDトラバーサル完了ポイント。

第3のステップは、BT->右、戻ってすぐに、第三の工程が終了し、第二段階に戻る空であるので、ノードBは、印刷開始、印刷ステートメントが完了した後に行わInorderTraversal(BT->右)を開始します、ノードBトラバーサル完了。

 

 

 

 

 

 

4.第二步完成打印后开始执行 InorderTraversal(BT->Right),BT->Right 不为空,开始执行第三步调用(此时在结点E位置处,但并未打印),开始执行InorderTraversal(BT->Left),由于BT->Left 为空,立刻返回,开始执行打印结点E,结点E遍历完成。

5.第三步执行完打印后,开始执行 InorderTraversal(BT->Right),由于非空,开始第四步调用(此时在结点 I 位置处,但并未打印),开始执行InorderTraversal(BT->Left),为空,立刻返回,开始执行打印结点 I ,结点 I 遍历完成。

6.第四步执行完打印后,开始执行 InorderTraversal(BT->Right),非空,立刻返回,第四步执行完毕,返回至第三步,此前第三步已完成执行InorderTraversal(BT->Right),所以第三步执行完毕,返回至第二步,因为从右孩子返回,第二步也执行完毕,返回至第一步,从左孩子返回,开始打印结点A,结点A遍历完成。

7.第一步执行完打印后,开始执行InorderTraversal(BT->Right),不为空,开始执行第二步调用(此时在结点C位置,但并未打印),开始执行InorderTraversal(BT->Left),不为空,开始第三步调用(此时在F位置,但并未打印),开始执行InorderTraversal(BT->Left),为空,立刻返回,开始打印结点F,结点F遍历完成。

8.第三步打印完后开始执行InorderTraversal(BT->Right),为空,立刻返回,第三步执行完毕,从左孩子返回,开始打印结点C,结点C遍历完成。

9.第二步打印完后,开始执行InorderTraversal(BT->Right),不为空,开始第三步调用(此时在结点G位置,但并未打印),执行InorderTraversal(BT->Left),为空,立刻返回,从左孩子返回,执行打印结点G,结点G遍历完成。

10.第三步打印完后,开始执行InorderTraversal(BT->Right),非空,开始第四步调用(此时在结点J位置,但并未打印),执行InorderTraversal(BT->Left),为空,立刻返回,从左孩子返回,执行打印结点J,结点J遍历完成。

11.第四步打印完后,开始执行InorderTraversal(BT->Right),为空,立刻返回,第四步执行完毕,返回至第三步,从右孩子返回,第三步执行完毕,返回至第二步,从右孩子返回,第二步执行完毕,返回至第一步,从右孩子返回,第一步结束,整个递归过程完成。

 

遍历顺序为:H->D->B->E->I->A->F->C->G->J

 

感悟:

1.中序遍历不像前序遍历一样调用到哪里就打印哪里,它要一直往左调用,从左孩子返回就打印,从右孩子返回就结束该步,返回至上一步,一直到第一步执行完毕。

2.可以这样理解,从左子树为空返回的先打印,左子树执行完毕返回后打印,右子树为空就一直向上返回。

3.在理解了这种遍历顺序后,就很好理解如何用栈去实现了,栈中保留自己和自己的右孩子都未访问过的元素,正好与从左孩子返回就打印,右孩子返回就执行完毕的递归原理相对应。

 

 

此章结束。

 

 

 

发布了19 篇原创文章 · 获赞 7 · 访问量 421

おすすめ

転載: blog.csdn.net/ATFWUS/article/details/104276649
おすすめ