05---二叉树---20195106023---王亚威.c
#include<stdio.h> #include<malloc.h> /* malloc()等 */ #include<process.h> /* exit() */ /* 函数结果状态代码 */ #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define MAX_TREE_SIZE 100 /* 二叉树的最大结点数 */ typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */ typedef int TElemType; TElemType Nil = 0; /* 设整型以0为空 */ typedef TElemType SqBiTree[MAX_TREE_SIZE]; /* 0号单元存储根结点 */ Status visit(TElemType e) { printf("%d ", e); return OK; } Status InitBiTree(SqBiTree T) { /* 构造空二叉树T。因为T是固定数组,不会改变,故不需要& */ int i; for (i = 0; i < MAX_TREE_SIZE; i++) T[i] = Nil; /* 初值为空 */ return OK; } Status CreateBiTree(SqBiTree T) { /* 按层序次序输入二叉树中结点的值, 构造顺序存储的二叉树T */ int i = 0; printf("\n\n\t\t\t\t\t按层创建二叉树\n\t\t\t\t\t"); printf("请按层序输入结点的值(整型)\n\n\t0表示空结点,空格隔开,输999结束。结点数≤%d:\n", MAX_TREE_SIZE); while (1) { scanf_s("%d", &T[i]); if (T[i] == 999) break; if (i != 0 && T[(i + 1) / 2 - 1] == Nil && T[i] != Nil) /* 此结点(不空)无双亲且不是根 */ { printf("出现无双亲的非根结点%d\n", T[i]); exit(ERROR); } i++; } while (i < MAX_TREE_SIZE) { T[i] = Nil; /* 将空赋值给T的后面的结点 */ i++; } return OK; } Status BiTreeEmpty(SqBiTree T) { /* 初始条件: 二叉树T存在 */ /* 操作结果: 若T为空二叉树,则返回TRUE,否则FALSE */ if (T[0] == Nil) /* 根结点为空,则树空 */ return TRUE; else return FALSE; } int BiTreeDepth(SqBiTree T) { /* 初始条件: 二叉树T存在。操作结果: 返回T的深度 */ int i, j = -1; for (i = MAX_TREE_SIZE - 1; i >= 0; i--) /* 找到最后一个结点 */ if (T[i] != Nil) break; i++; /* 为了便于计算 */ do j++; while (i >= pow(2, j)); return j; } Status Root(SqBiTree T, TElemType *e) { /* 初始条件: 二叉树T存在 */ /* 操作结果: 当T不空,用e返回T的根,返回OK;否则返回ERROR,e无定义 */ if (BiTreeEmpty(T)) /* T空 */ return ERROR; else { *e = T[0]; return OK; } } Status(*VisitFunc)(TElemType); /* 函数变量 */ void PreTraverse(SqBiTree T, int e) { /* PreOrderTraverse()调用 */ VisitFunc(T[e]); if (T[2 * e + 1] != Nil) /* 左子树不空 */ PreTraverse(T, 2 * e + 1); if (T[2 * e + 2] != Nil) /* 右子树不空 */ PreTraverse(T, 2 * e + 2); } Status PreOrderTraverse(SqBiTree T, Status(*Visit)(TElemType)) { /* 初始条件: 二叉树存在,Visit是对结点操作的应用函数 */ /* 操作结果: 先序遍历T,对每个结点调用函数Visit一次且仅一次。 */ /* 一旦Visit()失败,则操作失败 */ VisitFunc = Visit; if (!BiTreeEmpty(T)) /* 树不空 */ PreTraverse(T, 0); printf("\n"); return OK; } void InTraverse(SqBiTree T, int e) { /* InOrderTraverse()调用 */ if (T[2 * e + 1] != Nil) /* 左子树不空 */ InTraverse(T, 2 * e + 1); VisitFunc(T[e]); if (T[2 * e + 2] != Nil) /* 右子树不空 */ InTraverse(T, 2 * e + 2); } Status InOrderTraverse(SqBiTree T, Status(*Visit)(TElemType)) { /* 初始条件: 二叉树存在,Visit是对结点操作的应用函数 */ /* 操作结果: 中序遍历T,对每个结点调用函数Visit一次且仅一次。 */ /* 一旦Visit()失败,则操作失败 */ VisitFunc = Visit; if (!BiTreeEmpty(T)) /* 树不空 */ InTraverse(T, 0); printf("\n"); return OK; } void PostTraverse(SqBiTree T, int e) { /* PostOrderTraverse()调用 */ if (T[2 * e + 1] != Nil) /* 左子树不空 */ PostTraverse(T, 2 * e + 1); if (T[2 * e + 2] != Nil) /* 右子树不空 */ PostTraverse(T, 2 * e + 2); VisitFunc(T[e]); } Status PostOrderTraverse(SqBiTree T, Status(*Visit)(TElemType)) { /* 初始条件: 二叉树T存在,Visit是对结点操作的应用函数 */ /* 操作结果: 后序遍历T,对每个结点调用函数Visit一次且仅一次。 */ /* 一旦Visit()失败,则操作失败 */ VisitFunc = Visit; if (!BiTreeEmpty(T)) /* 树不空 */ PostTraverse(T, 0); printf("\n"); return OK; } void LevelOrderTraverse(SqBiTree T, Status(*Visit)(TElemType)) { /* 层序遍历二叉树 */ int i = MAX_TREE_SIZE - 1, j; while (T[i] == Nil) i--; /* 找到最后一个非空结点的序号 */ for (j = 0; j <= i; j++) /* 从根结点起,按层序遍历二叉树 */ if (T[j] != Nil) Visit(T[j]); /* 只遍历非空的结点 */ printf("\n"); } void main() { Status i; TElemType e; SqBiTree T, s; printf("\n"); printf("--------------------------------"); printf(" 2019级电科一班王亚威作品 "); printf("----------------------------------\n"); InitBiTree(T); CreateBiTree(T); printf(" \n树的深度=%d\n",BiTreeDepth(T)); i = Root(T, &e); if (i) printf("\n二叉树的根为:%d\n", e); else printf("树空,无根\n"); printf("\n先序遍历二叉树:\n"); PreOrderTraverse(T, visit); printf("\n中序遍历二叉树:\n"); InOrderTraverse(T, visit); printf("\n后序遍历二叉树:\n"); PostOrderTraverse(T, visit); printf("\n层序遍历二叉树:\n"); LevelOrderTraverse(T, visit); }