二叉树的三种遍历方式

来源:互联网 发布:android php服务器 编辑:程序博客网 时间:2024/05/22 00:21

遍历是按某种策略访问树中的每个结点,且仅访问一次的过程。由于二叉树所具有的递归性质,一棵非空的二叉树是由根结点、左子树和右子树三部分构成的,因此若能依次遍历这三部分,也就遍历了整棵二叉树。按照先遍历左子树后遍历右子树的约定,根据访问根结点位置的不同,可得到二叉树的先序、中序和后序三中遍历方法。此外,对二叉树还可进行层序遍历。


(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);    /*先访问根结点*/}}


0 0