二叉树的简介及链式结构实现
二叉树:每个结点的直接子结点最多只能有两个,且有左右之分。
完全二叉树:除最后一层外,每一层结点数为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 }