二叉树的简介及链式结构实现

二叉树:每个结点的直接子结点最多只能有两个,且有左右之分。

完全二叉树:除最后一层外,每一层结点数为2^(i-1)个,最后一层的结点数若不满足2^(i-1),那么最后一层结点是自左向右排列的。

 

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 #define TRUE 1
  5 #define FALSE 0
  6 #define OVERFLOW -2
  7 #define OK 1
  8 #define ERROR 0
  9 
 10 typedef int Status;
 11 typedef int TElemType;
 12 
 13 /*
 14  * 存储结构
 15  */
 16 typedef struct BiTNode
 17 {
 18     TElemType data;    //数据
 19     struct BiTNode *lchild, *rchild;
 20 }BiTNode, *BiTree;
 21 
 22 /*
 23  * 创建二叉树,输入0表示创建空树
 24  */
 25 Status CreateBiTree(BiTree *T)
 26 {
 27     TElemType e;
 28     scanf("%d", &e);
 29     if (e == 0)
 30     {
 31         *T = NULL;
 32     }
 33     else
 34     {
 35         *T = (BiTree) malloc(sizeof(BiTNode));
 36         if (!T)
 37         {
 38             exit(OVERFLOW);
 39         }
 40         (*T)->data = e;
 41         CreateBiTree(&(*T)->lchild);    //创建左子树
 42         CreateBiTree(&(*T)->rchild);    //创建右子树
 43     }
 44     return OK;
 45 }
 46 
 47 /*
 48  * 访问元素
 49  */
 50 void visit(TElemType e)
 51 {
 52     printf("%d ", e);
 53 }
 54 
 55 /*
 56  * 先序遍历二叉树:指先访问根,然后访问孩子的遍历方式
 57  */
 58 Status PreOrderTraverse(BiTree T, void (*visit)(TElemType))
 59 {
 60     if (T)
 61     {
 62         visit(T->data);
 63         PreOrderTraverse(T->lchild, visit);
 64         PreOrderTraverse(T->rchild, visit);
 65     }
 66 }
 67 
 68 /*
 69  * 中序遍历二叉树:指先访问左(右)孩子,然后访问根,最后访问右(左)孩子的遍历方式
 70  */
 71 Status InOrderTraverse(BiTree T, void (*visit)(TElemType))
 72 {
 73     if (T)
 74     {
 75         InOrderTraverse(T->lchild, visit);
 76         visit(T->data);
 77         InOrderTraverse(T->rchild, visit);
 78     }
 79 }
 80 
 81 /*
 82  * 后序遍历二叉树:指先访问孩子,然后访问根的遍历方式
 83  */
 84 Status PostOrderTraverse(BiTree T, void (*visit)(TElemType))
 85 {
 86     if (T)
 87     {
 88         PostOrderTraverse(T->lchild, visit);
 89         PostOrderTraverse(T->rchild, visit);
 90         visit(T->data);
 91     }
 92 }
 93 
 94 int main()
 95 {
 96     BiTree T;
 97     printf("创建树,输入0为空树:\n");
 98     CreateBiTree(&T);
 99     printf("先序遍历:");
100     PreOrderTraverse(T, *visit);
101     printf("\n中序遍历:");
102     InOrderTraverse(T, *visit);
103     printf("\n后序遍历:");
104     PostOrderTraverse(T, *visit);
105     printf("\n");
106 }

 

posted @ 2015-05-25 22:19  niceforbear  阅读(427)  评论(0编辑  收藏  举报