二叉树简单实现
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 }