代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MaxSize 50//定义MaxSize最大值为50
typedef int ElemType; //数据类型
//定义二叉树结构体
typedef struct BiTNode {
ElemType data; //数据域
struct BiTNode* lChild, * rChlid; //左右子树域
}BiTNode, * BiTree;
//先序创建二叉树
ElemType CreateBiTree(BiTree &T)
{
ElemType ch;//输入二叉树数据
scanf_s("%d", &ch);
if (ch==0)//当数据为零时表示没有该叶子节点
T = NULL;
else
{
T = (BiTree)malloc(sizeof(BiTNode));//分配大小
if (T !=NULL)//当树不为空时,先序遍历递归建立二叉树
{
T->data = ch;
printf("输入%d的左子节点:", ch);
CreateBiTree(T->lChild);
printf("输入%d的右子节点:", ch);
CreateBiTree(T->rChlid);
}
}
return 1;
}
void Visit(BiTree T)//打印二叉树元素
{
printf("%d ", T->data);
}
//先序遍历二叉树
void TraverseBiTree(BiTree T)
{
if (T==NULL)
return;
Visit(T);
TraverseBiTree(T->lChild);
TraverseBiTree(T->rChlid);
}
//中序遍历二叉树
void InOrderBiTree(BiTree T)
{
if (NULL == T)
return;
InOrderBiTree(T->lChild);
Visit(T);
InOrderBiTree(T->rChlid);
}
//后序遍历二叉树
void PostOrderBiTree(BiTree T)
{
if (NULL == T)
return;
PostOrderBiTree(T->lChild);
PostOrderBiTree(T->rChlid);
Visit(T);
}
//递归求二叉树的深度
int TreeDeep1(BiTree T)
{
if (T == NULL)
return 0;
else
{
int leftdeep = TreeDeep1(T->lChild);
int rightdeep = TreeDeep1(T->rChlid);
if (leftdeep >= rightdeep)
return leftdeep+1;
else
return rightdeep+1;
}
}
int TreeDeep2(BiTree T) //非递归求二叉树深度
{
if (T == NULL)//树空返回0
return 0;
else
{
BiTree Q[MaxSize];//定义一个足够储存树中所有元素的队列
int front = -1, rear = -1;//front为队头,rear为队尾
int last = 0, level = 0;//last指向当前层最右节点
rear++;//指针加一头节点入队
Q[rear] = T;
BiTree P =NULL;//定义一个运动指针
while (front < rear)
{
front++;//队头指针加一,队头元素出队
P = Q[front];
if (P->lChild != NULL)//左子树不为空,左孩子入队
{
rear++;
Q[rear] = P->lChild;
}
if (P->rChlid != NULL)//右子树不为空,右孩子入队
{
rear++;
Q[rear] = P->rChlid;
}
if (front == last)//处理该层最右节点
{
level++;//层数加一
last = rear;//last指向下一层最右节点
}
}//else
return level;//返回树的深度
}//while
}
//主函数
int main(void)
{
BiTree T;
T = (BiTree)malloc(sizeof(BiTNode));
while (1)
{
printf("\n**********输入接下来的操作**************\n");
printf(" 操作1:先序遍历建立二叉树\n");
printf(" 操作2:先序遍历打印二叉树\n");
printf(" 操作3:中序遍历打印二叉树\n");
printf(" 操作4:后序遍历打印二叉树\n");
printf(" 操作5:递归求二叉树深度\n");
printf(" 操作6:非递归求二叉树深度\n");
printf(" 操作-1:结束\n\n");
int count =0;
int deepth;
printf(" *操作:");
scanf_s("%d", &count);
if (count == -1)
break;
switch (count)
{
case 1:
printf("(请输入结点的值,0表示没有叶结点)\n");
printf("输入第一个节点的值:");
CreateBiTree(T);
break;
case 2:
printf("先序遍历二叉树:");
TraverseBiTree(T);
printf("\n");
break;
case 3:
printf("中序遍历二叉树:");
InOrderBiTree(T);
printf("\n");
break;
case 4:
printf("后序遍历二叉树:");
PostOrderBiTree(T);
printf("\n");
break;
case 5:
deepth = TreeDeep1(T);
printf("树的深度为:%d", deepth);
printf("\n");
break;
case 6:
deepth = TreeDeep2(T);
printf("树的深度为:%d", deepth);
printf("\n");
break;
}
}
return 0;
}
运行示例: