遍历是按某种策略访问树中的每个结点,且仅访问一次的过程。由于二叉树所具有的递归性质,一棵非空的二叉树是由根结点、左子树和右子树三部分构成的,因此若能依次遍历这三部分,也就遍历了整棵二叉树。按照先遍历左子树后遍历右子树的约定,根据访问根结点位置的不同,可得到二叉树的先序、中序和后序三中遍历方法。此外,对二叉树还可进行层序遍历。
(1)先序就是先遍历根,再遍历左子树,再遍历右子树。例如上图的先序遍历是:ABCDEFGHK
#include<cstdio> #include <cstdlib> typedef char TelemType; typedef struct TNode { TelemType data; struct TNode *lchild, *rchild; } BitNode; //声明 BitNode* createTree(void); void inOrderTraverse(BitNode *); int main(int agrc, char *argv[]) { BitNode *root = NULL; root = createTree(); printf("\n先序遍历二叉树:"); inOrderTraverse(root); system("pause"); return 0; } //创建二叉树 BitNode* createTree(void) { BitNode *b; TelemType ch; scanf("%c", &ch); if (ch == '#') { b = NULL; } else { b = (BitNode *)malloc(sizeof(BitNode)); b->data = ch; b->lchild = createTree(); b->rchild = createTree(); } return b; } //先序遍历 void inOrderTraverse(BitNode *root) { if (root!=NULL) { printf("%d", root->data); /*先访问根结点*/ inOrderTraverse(root->lchild); inOrderTraverse(root->rchild); } }
(2)中序就是先遍历左子树,再遍历根,再右子树。例如上图的中序遍历是:BDCAEHGKF#include<cstdio> #include <cstdlib> typedef char TelemType; typedef struct TNode { TelemType data; struct TNode *lchild, *rchild; } BitNode; //声明 BitNode* createTree(void); void inOrderTraverse(BitNode *); int main(int agrc, char *argv[]) { BitNode *root = NULL; root = createTree(); printf("\n中序遍历二叉树:"); inOrderTraverse(root); system("pause"); return 0; } //创建二叉树 BitNode* createTree(void) { BitNode *b; TelemType ch; scanf("%c", &ch); if (ch == '#') { b = NULL; } else { b = (BitNode *)malloc(sizeof(BitNode)); b->data = ch; b->lchild = createTree(); b->rchild = createTree(); } return b; } //中序遍历 void inOrderTraverse(BitNode *root) { if (root) { inOrderTraverse(root->lchild); printf("%c", root->data); inOrderTraverse(root->rchild); } }
从A出发,到了B你现在处理的就是B为根的树,要把B这颗树处理完。中序,先访问左子树,B的左子树为空,然后访问根,就是访问B,这时候输出B。然后代码的下一句是访问右子树,现在到了CD这棵树,先找这树的左子树,是D。D没有左子树,访问根,就是D本身,输出。看右子树,D右子树也是空,返回,访问输出C。再看C的右子树,没有。一层层返回,到A,输出A。再看A的右子树……递归这事,就是每次把问题规模缩小一点,然后用同样的方法去解决它。(3)后序就是先遍历左子树,再右子树,再根。例如上图的后序遍历是:DCBHKGFEA#include<cstdio> #include <cstdlib> typedef char TelemType; typedef struct TNode { TelemType data; struct TNode *lchild, *rchild; } BitNode; //声明 BitNode* createTree(void); void inOrderTraverse(BitNode *); int main(int agrc, char *argv[]) { BitNode *root = NULL; root = createTree(); printf("\n后序遍历二叉树:"); inOrderTraverse(root); system("pause"); return 0; } //创建二叉树 BitNode* createTree(void) { BitNode *b; TelemType ch; scanf("%c", &ch); if (ch == '#') { b = NULL; } else { b = (BitNode *)malloc(sizeof(BitNode)); b->data = ch; b->lchild = createTree(); b->rchild = createTree(); } return b; } //后序遍历 void inOrderTraverse(BitNode *root) { if (root!=NULL) { inOrderTraverse(root->lchild); inOrderTraverse(root->rchild); printf("%d", root->data); /*先访问根结点*/ } }