/* 6.8 遍历二叉树 二叉树的遍历方式可以很多,如果我们限制了 从左到右二的 习惯方式,那么主要分为四种: 1.前序遍历 ABDGH-CEIF 2.中序遍历 GDHBAE-ICF 3.后序遍历 GHDBIEFCA 4.层序遍历 ABCDEFGHI 下图二叉树 详看p313-316 图 A B C D E F G H I 说明:这不要硬记,这只是给一个通用的规则,方便对二叉树进行遍历而已 有同学会说,研究这么多遍历的方法干什么呢? 我们用图形的方式表现树的结构,应该说是非常直观和容易理解,但是对于计算机来说,它只有循环、判断等方式来处理,也就是说, 它只会处理线性序列,而我们刚才提到的四种遍历方法,其实都是在把树中的结点变成某种意义的线性序列,这就给程序实现带来了好处。 另外不同的遍历提供了对结点依次处理的不同方式,可以在遍历过程中对结点进行各种处理。 */ /* 6.8.3 前序遍历算法 二叉树的定义是递归的方式,所以,实现遍历算法也可以采用递归,而且极其简洁明了。 */ //二叉树的前序遍历递归算法 void PreOrderTraverse(BiTree T) { if(T == NULL) return; //显示结点数据,可以更改为其他对节点操作 printf("%c", T->data); //再先序遍历左子树 PreOrderTraverse(T->lchild); //再后续遍历右子树 PreOrderTraverse(T->rchild); } /* 6.8.4 中序遍历算法 那么中序遍历算法是如何的呢? 别以为很复杂,它和前序遍历算法仅仅只是代码的顺序上的差异。 */ //二叉树的中序遍历递归算法 void InOrderTraverse(BiTree T) { if (T == NULL) return; //中序遍历左子树 InOrderTraverse(T->lchild); //显示节点数据,可以更改为其他对节点操作 printf("%c", T->data); //最后中序遍历右子树 InOrderTraverse(T->rchild); } /* 6.8.5 后续遍历算法 */ void PostOrderTraverse(BiTree T) { if (T == NULL) return; //先后序遍历左子树 PostOrderTraverse(T->lchild); //在后序遍历右子树 PostOrderTraverse(T->rchild); //显示结点数据,可以更改为其他对结点操作 printf("%c". T->data); }