当前位置:文档之家› 数据结构:二叉树子系统

数据结构:二叉树子系统

./**题目:按屏幕提示用前序方法建立一棵二叉树,并能按凹入法显示二叉树结构。

* 编写前序遍历、中序遍历、后序遍历、层次遍历程序。

* 编写求二叉树的叶结点数、总结点数和深度的程序。

* 设计一个选择式菜单,以菜单方式选择下列操作。

* 二叉树子系统* ******************************** * 1------建二叉树** * 2------凹入显示** * 3------先序遍历** * 4------中序遍历** * 5------后序遍历** * 6------层次遍历** * 7------求叶子数** * 8------求结点数** * 9------求树深度** * 0------返回** ******************************** 请选择菜单号(0--9)*/#include <stdio.h>#include <stdlib.h>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 *t);/************************************************* Function: main()Description: 主调函数'..Calls: createTree()showTree()preOrder()postOrder()inOrder()leafNum()levelOrder()nodeNum()treeDepth()Input: NULLReturn: voidOthers: NULL*************************************************/ void main(){BT *t = NULL;int choice, k = 1;while (k){printf(\二叉树子系统\n);printf(*******************************\n);printf(* 1------建二叉树*\n);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'表示该结点为空):);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:牰湩晴尨层次遍历序列:);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{printf(%d。

\n, treeDepth(t));}break;case 0:k = 0;break;default:k = 1;break;}}'..}/************************************************* Function: createTree()Description: 建立二叉树Calls: createTree()Input: NULLReturn: BT *Others: NULL*************************************************/ BT *createTree() //建立二叉树{BT *t;char x;getchar();scanf(%c, &x); //获取输入的结点值if (x == '0') //输入的值为零,结点为空{t = NULL;}else{t = (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: voidInput: t:结点指针Return: voidOthers: NULL*************************************************/void showTree(BT *t) //显示二叉树'..{BT *sta[100], *p;int lev[100][2]; //第一个空存要空的长度,第二空存左右孩子的标示int tp, n, i, wid = 4;if (t != NULL) //结点非空{牰湩晴尨凹入表示法:\n);tp = 1;sta[tp] = t; //将各个结点的指针放在指针数组中lev[tp][0] = wid; //显示的前面的空白长度while (tp > 0){p = sta[tp];n = lev[tp][0];//显示for (i = 0; i< n; i++){printf( );}printf(%c, p->data);for (i = n+1; i < 30; i+=2){牰湩晴尨▄);}printf(\);tp--;//记录左右孩子if (p->lchild != NULL){tp++;sta[tp] = p->lchild;lev[tp][0] = n+wid;lev[tp][1] = 1;}if (p->rchild != NULL){tp++;sta[tp] = p->rchild;lev[tp][0] = n+wid;'..lev[tp][1] = 2;}}}}/************************************************* Function: preOrder()Description: 先序遍历Calls: preOrder()Input: t:结点指针Return: voidOthers: NULL*************************************************/void preOrder(BT *t) //先序遍历{if (t) //结点不为空{printf(<, t->data); //显示preOrder(t->lchild); //递归调用preOrder(t->rchild);}}/************************************************* Function: postOrder()Description: 后序遍历Calls: postOrder()Input: t:结点指针Return: voidOthers: NULL*************************************************/ void postOrder(BT *t) //后序遍历{if (t) //结点不为空{postOrder(t->lchild);postOrder(t->rchild);printf(<, t->data); //显示}}/************************************************* Function: inOrder()'..Description: 中序遍历Calls: inOrder()Input: t:结点指针Return: voidOthers: NULL*************************************************/ void inOrder(BT *t) //中序遍历{if (t) //结点不为空{inOrder(t->lchild);printf(<, t->data); //显示inOrder(t->rchild);}}/************************************************* Function: levelOrder()Description: 层次遍历Calls: voidInput: t:结点指针Return: voidOthers: NULL*************************************************/void levelOrder(BT *t) //层次遍历{int i, j;BT *q[100]; //指针数组BT *p;p = t;if (p != NULL) //结点非空{i = 1;q[i] = p;j = 2;}while (i != j) //先将每个结点的指针存入指针数组中,在显示出来{p = q[i];printf(<, p->data);'..if (p->lchild != NULL) //左孩子非空{q[j] = p->lchild;j++;}if (p->rchild != NULL) //左孩子非空{q[j] = p->rchild;j++;}i++; //为了显示下一个结点}}/************************************************* Function: leafNum()Description: 求二叉树叶子数Calls: leafNum()Input: t:结点指针Return: intOthers: NULL*************************************************/int leafNum(BT *t) //叶子数{int i = 0;if (t->lchild == NULL && t->rchild == NULL) //左右孩子都为空{i++;}else{i = leafNum(t->lchild) + i; //递归访问左孩子的叶子数i = leafNum(t->rchild) + i;}return i;}/************************************************* Function: nodeNum()Description: 求二叉树结点数Calls: nodeNum()'..Input: t:结点指针Return: intOthers: NULL*************************************************/ int nodeNum(BT *t) //结点数{int i = 0;if (t) //结点不为空{i++;i = nodeNum(t->lchild) + i;i = nodeNum(t->rchild) + i;}return i;}/************************************************* Function: treeDepth()Description: 求二叉树的深度Calls: treeDepth()Input: t:结点指针Return: intOthers: NULL*************************************************/ int treeDepth(BT *t) //二叉树的深度{int ldep, rdep;if (t == NULL) //结点不为空{return 0;}else{ldep = treeDepth(t->lchild);rdep = treeDepth(t->rchild);if (ldep > rdep) //左深度大于右深度{return ldep+1; //返回左深度的值}else'..{return rdep+1;}}}'.。

相关主题