#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(" 按层创建二叉树 "); printf("请按层序输入结点的值(整型) 0表示空结点,空格隔开,输999结束。结点数≤%d: ", 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 ", 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(" "); 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(" "); 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(" "); 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(" "); } void main() { Status i; TElemType e; SqBiTree T, s; printf(" "); printf("--------------------------------"); printf(" 2019级电科一班王亚威作品 "); printf("---------------------------------- "); InitBiTree(T); CreateBiTree(T); printf(" 树的深度=%d ",BiTreeDepth(T)); i = Root(T, &e); if (i) printf(" 二叉树的根为:%d ", e); else printf("树空,无根 "); printf(" 先序遍历二叉树: "); PreOrderTraverse(T, visit); printf(" 中序遍历二叉树: "); InOrderTraverse(T, visit); printf(" 后序遍历二叉树: "); PostOrderTraverse(T, visit); printf(" 层序遍历二叉树: "); LevelOrderTraverse(T, visit); }