1、数据结构二叉树子系统. /* *题目:按屏幕提示用前序方法建立一棵二叉树,并能按凹入法显示二叉树结构。 * 编写前序遍历、中序遍历、后序遍历、层次遍历程序。 * 编写求二叉树的叶结点数、总结点数和深度的程序。 * 设计一个选择式菜单,以菜单方式选择下列操作。 * 二叉树子系统 * * * * 1-建二叉树 * * * 2-凹入显示 * * * 3-先序遍历 * * * 4-中序遍历 * * * 5-后序遍历 * * * 6-层次遍历 * * * 7-求叶子数 * * * 8-求结点数 * * * 9-求树深度 * * * 0-返 回 * * * * 请选择菜单号(0-9) */ #includ
2、e #include typedef struct bTree /二叉树结点 char data; /值域 struct bTree *lchild; /左孩子 struct bTree *rchild; /右孩子 BT; BT *createTree(); void showTree(BT *t); void preOrder(BT *t); void postOrder(BT *t); void inOrder(BT *t); void levelOrder(BT *t); int leafNum(BT *t); int nodeNum(BT *t); int treeDepth(BT *
3、t); /* Function: main() Description: 主调函数 . . Calls: createTree() showTree() preOrder() postOrder() inOrder() leafNum() levelOrder() nodeNum() treeDepth() Input: NULL Return: void Others: NULL */ void main() BT *t = NULL; int choice, k = 1; while (k) printf( 二叉树子系统n); printf(*n); printf(* 1-建二叉树 *n)
4、; printf(* 2-凹入显示 *n); printf(* 3-先序遍历 *n); printf(* 4-中序遍历 *n); printf(* 5-后序遍历 *n); printf(* 6-层次遍历 *n); printf(* 7-求叶子数 *n); printf(* 8-求结点数 *n); printf(* 9-求树深度 *n); printf(* 0-返 回 *n); printf(*n); 牰湩晴尨请选择菜单号(0-9):); fflush(stdin); scanf(%d, &choice); switch(choice) case 1: 牰湩晴尨请输入根结点(0表示该结点为空):
5、); t = createTree(); 牰湩晴尨二叉树建立成功。n); break; . . case 2: showTree(t); break; case 3: 牰湩晴尨先序遍历序列:); if (t = NULL) 牰湩晴尨空。n); else preOrder(t); break; case 4: 牰湩晴尨中序遍历序列:); if (t = NULL) 牰湩晴尨空。n); else inOrder(t); break; case 5: 牰湩晴尨后序遍历序列:); if (t = NULL) 牰湩晴尨空。n); else postOrder(t); break; case 6: 牰湩晴
6、尨层次遍历序列:); if (t = NULL) 牰湩晴尨空。n); else . . levelOrder(t); break; case 7: 牰湩晴尨该二叉树的叶子数:); if (t = NULL) printf(。n); else printf(%d。n, leafNum(t); break; case 8: 牰湩晴尨该二叉树的结点数为:); if (t = NULL) printf(。n); else printf(%d。n, nodeNum(t); break; case 9: 牰湩晴尨该二叉树的深度为:); if (t = NULL) printf(。n); else prin
7、tf(%d。n, treeDepth(t); break; case 0: k = 0; break; default: k = 1; break; . . /* Function: createTree() Description: 建立二叉树 Calls: createTree() Input: NULL Return: BT * Others: NULL */ BT *createTree() /建立二叉树 BT *t; char x; getchar(); scanf(%c, &x); /获取输入的结点值 if (x = 0) /输入的值为零,结点为空 t = NULL; else t
8、 = (BT *)malloc(sizeof(BT); t-data = x; /赋值 牰湩晴尨请输入结点%c的左孩子:, t-data); t-lchild = createTree(); /递归建立左孩子 牰湩晴尨请输入结点%c的右孩子:, t-data); t-rchild = createTree(); /递归调用 return t; /* Function: showTree() Description: 凹入显示二叉树 Calls: void Input: t:结点指针 Return: void Others: NULL */ void showTree(BT *t) /显示二叉树
9、 . . BT *sta100, *p; int lev1002; /第一个空存要空的长度,第二空存左右孩子的标示 int tp, n, i, wid = 4; if (t != NULL) /结点非空 牰湩晴尨凹入表示法:n); tp = 1; statp = t; /将各个结点的指针放在指针数组中 levtp0 = wid; /显示的前面的空白长度 while (tp 0) p = statp; n = levtp0; /显示 for (i = 0; idata); for (i = n+1; i lchild != NULL) tp+; statp = p-lchild; levtp0
10、= n+wid; levtp1 = 1; if (p-rchild != NULL) tp+; statp = p-rchild; levtp0 = n+wid; . . levtp1 = 2; /* Function: preOrder() Description: 先序遍历 Calls: preOrder() Input: t:结点指针 Return: void Others: NULL */ void preOrder(BT *t) /先序遍历 if (t) /结点不为空 printf(data); /显示 preOrder(t-lchild); /递归调用 preOrder(t-rchild); /* Function: postOrder() Description: 后序遍历 Calls: postOrder() Input: t:结点指针 Return: void Others: NULL *