二叉树递归遍历

  1 /* 模块名      : 树
  2 /* 文件名      : btree.cpp
  3 /* 功能描述    : 二叉树的递归遍历
  4 
  5 /* 备注        : 输入示例与输出结果
  6 /* e.g. input  : ABD###CE#F###
  7 /* bi-tree     :
  8 /*                 A
  9 /*                / 
 10 /*               B   C
 11 /*              /   /
 12 /*             D   E
 13 /*                  
 14 /*                   F
 15 /* 
 16 /* pre-order traverse: A B D C E F
 17 /* in-order traverse: D B A E F C
 18 /* post-order traverse: D B F E C A
 19 *******************************************************************************/
 20 #include <stdio.h>
 21 #include <stdlib.h>
 22 #include <string>
 23 
 24 /******************************************************************************
 25 /* 数据类型和常量定义
 26 /******************************************************************************/
 27 #define OK           1
 28 #define ERROR        0
 29 #define OVERFLOW    -2
 30 
 31 typedef int Status;
 32 typedef int TElemType;
 33 
 34 
 35 /******************************************************************************
 36 /* 数据结构声明
 37 /******************************************************************************/
 38 /* 二叉树的链式存储结构 */
 39 typedef struct BiTNode {
 40     TElemType data;
 41     struct BiTNode *lchild, *rchild; /* 左右孩子指针 */
 42 } BiTNode, *BiTree;
 43 
 44 
 45 /******************************************************************************
 46 /* 函数原型声明
 47 /******************************************************************************/
 48 Status Visit(TElemType e);
 49 Status PreOrderTraverse(BiTree T, Status (*Visit)(TElemType));
 50 Status InOrderTraverse(BiTree T, Status (*Visit)(TElemType));
 51 Status PostOrderTraverse(BiTree T, Status (*Visit)(TElemType));
 52 
 53 
 54 //功能     : 打印节点数据
 55 Status Visit(TElemType e)
 56 {
 57     printf("%c", e);
 58     return OK;
 59 }
 60 
 61 //功能     : 前序遍历二叉树
 62 Status PreOrderTraverse(BiTree T, Status (*Visit)(TElemType))
 63 {
 64     if(T){
 65         if(Visit(T->data))
 66             if(PreOrderTraverse(T->lchild, Visit))
 67                 if(PreOrderTraverse(T->rchild, Visit))
 68                     return OK;
 69                 return ERROR;
 70     }
 71     else
 72         return OK;
 73 }
 74 
 75 
 76 //功能     : 中序遍历二叉树
 77 Status InOrderTraverse(BiTree T, Status (*Visit)(TElemType))
 78 {
 79     if(T){
 80         if(InOrderTraverse(T->lchild, Visit))
 81             if(Visit(T->data))
 82                 if(InOrderTraverse(T->rchild, Visit))
 83                     return OK;
 84                 return ERROR;
 85     }
 86     else
 87         return OK;
 88 }
 89 
 90 //功能     : 后序遍历二叉树
 91 Status PostOrderTraverse(BiTree T, Status (*Visit)(TElemType))
 92 {
 93     if(T){
 94         if(PostOrderTraverse(T->lchild, Visit))
 95             if(PostOrderTraverse(T->rchild, Visit))
 96                 if(Visit(T->data))
 97                     return OK;
 98                 return ERROR;
 99     }
100     else
101         return OK;
102 }
103 
104 
105 //功能     : 创建二叉树
106 //备注     : 前序方式创建
107 Status CreateBiTree(BiTree &T)
108 {
109     char ch = getchar();
110     if('#' == ch) T = NULL;
111     else {
112         if(!(T = (BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
113         T->data = ch;             //生成根结点
114         CreateBiTree(T->lchild);  //构造左子树
115         CreateBiTree(T->rchild);  //构造右子树
116     }
117     return OK;
118 }
119 
120 void main()
121 {
122     BiTree T;
123     CreateBiTree(T);
124 
125     printf("Pre Order Traverse: ");
126     PreOrderTraverse(T, Visit);        //前序方式遍历二叉树
127 
128     printf("
In Order Traverse: ");
129     InOrderTraverse(T, Visit);         //中序方式遍历二叉树
130 
131     printf("
Post Order Traverse: ");
132     PostOrderTraverse(T, Visit);       //后序方式遍历二叉树
133 }

来源:http://www.cnblogs.com/JCSU/articles/2005904.html

原文地址:https://www.cnblogs.com/heyonggang/p/3292436.html