二叉树简单实现

  1 #include "stdio.h"
  2 #include "stdlib.h"
  3 
  4 #define MAXSIZE 100
  5 typedef char TElemType;
  6 typedef struct BiTNode {
  7     TElemType data;
  8     struct BiTNode *lchild;
  9     struct BiTNode *rchild;
 10 } BiTNode, *BiTree;
 11 
 12 //定义函数指针
 13 typedef void(*Visit)(BiTree);
 14 
 15 //二叉树的初始化
 16 void Init_BiTree(BiTree *T) {
 17     *T = NULL;
 18 }
 19 
 20 int IsEmpty_BiTree(BiTree *T) {
 21     return *T == NULL;
 22 }
 23 
 24 //创建二叉树
 25 void Create_BiTree(BiTree *T) {
 26     char ch;
 27     ch = getchar();
 28     //当输入的是"#"时,认为该子树为空
 29     if (ch == '#')
 30         *T = NULL;
 31         //创建树结点
 32     else {
 33         *T = (BiTree) malloc(sizeof(BiTNode));
 34         (*T)->data = ch; //生成树结点
 35         Create_BiTree(&(*T)->lchild);
 36         Create_BiTree(&(*T)->rchild);
 37     }
 38 }
 39 
 40 void Print_BiTreeNode(BiTree T) {
 41     printf("%c ", T->data);
 42 
 43 }
 44 
 45 //先序遍历二叉树
 46 void PreOrder_BiTree(BiTree T, Visit visit) {
 47     if (!IsEmpty_BiTree(&T)) {
 48         visit(T);
 49         PreOrder_BiTree(T->lchild, visit);
 50         PreOrder_BiTree(T->rchild, visit);
 51     }
 52 }
 53 
 54 //中序遍历二叉树
 55 void InOrder_BiTree(BiTree T, Visit visit) {
 56     if (!IsEmpty_BiTree(&T)) {
 57         InOrder_BiTree(T->lchild, visit);
 58         visit(T);
 59         InOrder_BiTree(T->rchild, visit);
 60     }
 61 }
 62 
 63 //后序遍历二叉树 
 64 void PostOrder_BiTree(BiTree T, Visit visit) {
 65     if (!IsEmpty_BiTree(&T)) {
 66         PostOrder_BiTree(T->lchild, visit);
 67         PostOrder_BiTree(T->rchild, visit);
 68         visit(T);
 69     }
 70 }
 71 
 72 //层次遍历二叉树 
 73 void LevelOrder_BiTree(BiTree T, Visit visit) {
 74     //用一个队列保存结点信息,这里的队列采用的是顺序队列中的数组实现
 75     int front = 0;
 76     int rear = 0;
 77     BiTree BiQueue[MAXSIZE];
 78     BiTree tempNode;
 79     if (!IsEmpty_BiTree(&T)) {
 80         //将根结点加入到队列中 
 81         BiQueue[rear++] = T;
 82 
 83         while (front != rear) {
 84             //取出队头元素,并使队头指针向后移动一位 
 85             tempNode = BiQueue[front++];
 86             //判断左右子树是否为空,若为空,则加入队列 
 87             if (!IsEmpty_BiTree(&(tempNode->lchild)))
 88                 BiQueue[rear++] = tempNode->lchild;
 89 
 90             if (!IsEmpty_BiTree(&(tempNode->rchild)))
 91                 BiQueue[rear++] = tempNode->rchild;
 92             visit(tempNode);
 93         }
 94     }
 95 }
 96 
 97 int main() {
 98     BiTree T;
 99     Init_BiTree(&T);
100     Create_BiTree(&T);
101     printf("\n先序遍历结果:");
102     PreOrder_BiTree(T, Print_BiTreeNode);
103     printf("\n中序遍历结果:");
104     InOrder_BiTree(T, Print_BiTreeNode);
105     printf("\n后序遍历结果:");
106     PostOrder_BiTree(T, Print_BiTreeNode);
107     printf("\n层次遍历结果:");
108     LevelOrder_BiTree(T, Print_BiTreeNode);
109     return 0;
110 }

 

posted @ 2017-12-10 18:16  ixummer  阅读(273)  评论(0编辑  收藏  举报