那么二叉树的中序遍历算法是如何呢?哈哈,别以为很复杂,它和前序遍历算法仅仅只是代码的顺序上的差异。

    1. /* 二叉树的中序遍历递归算法 */
    2. void InOrderTraverse(BiTree T){
    3. if (T == NULL)
    4. return;
    5. /* 中序遍历左子树 */
    6. InOrderTraverse(T->lchild);
    7. /* 显示结点数据,可以更改为其他对结点操作 */
    8. printf("%c", T->data);
    9. /* 最后中序遍历右子树 */
    10. InOrderTraverse(T->rchild);
    11. }

    换句话说,它等于是把调用左孩子的递归函数提前了,就这么简单。我们来看看当调用InOrder-Traverse(T)函数时,程序是如何运行的。

    1. 调用InOrderTraverse(T),T的根结点不为null,于是调用InOrderTraverse(T->lchild);访问结点B。当前指针不为null,继续调用InOrderTraverse(T->lchild);访问结点D。不为null,继续调用InOrderTraverse(T->lchild);访问结点H。继续调用InOrderTraverse(T->lchild);访问结点H的左孩子,发现当前指针为null,于是返回。打印当前结点H,如图6-8-14所示。

    image.png

    1. 然后调用InOrderTraverse(T->rchild);访问结点H的右孩子K,因结点K无左孩子,所以打印K,如图6-8-15所示。

    image.png

    1. 因为结点K没有右孩子,所以返回。打印结点H函数执行完毕,返回。打印字母D,如图6-8-16所示。

    image.png

    1. 结点D无右孩子,此函数执行完毕,返回。打印字母B,如图6-8-17 所示。

    image.png

    1. 调用InOrderTraverse(T->rchild);访问结点B的右孩子E,因结点E无左孩子,所以打印E,如图6-8-18所示。

    image.png

    1. 结点E无右孩子,返回。结点B的递归函数执行完毕,返回到了最初我们调用In-OrderTraverse的地方,打印字母A,如图6-8-19所示。

    image.png

    1. 再调用InOrderTraverse(T->rchild);访问结点A的右孩子C,再递归访问结点C的左孩子F,结点F的左孩子I。因为I无左孩子,打印I,之后分别打印F、C、G、J。步骤省略。

    综上,中序遍历这棵二叉树的节点顺序是:HKDBEAIFCGJ。