#include <stdio.h>
#include <stdlib.h>
#define TElemType char
#define ERROR 0
#define OK 1
#define MaxLength 10 //结点数不超过个
/*********二叉树的链表存储表示**********/
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild; //左右孩子指针
}BiTNode,*BiTree;
/**********创建树***********/
int CreatTree(BiTree &T)
{
TElemType ch;
ch = getchar();
if(ch == ',') //如果输入的字符为',',则此结点为叶子结点
{
T = NULL;
}else
{
T = (BiTree)malloc(sizeof(BiTNode)); //建立结点
if(! T) //创建结点失败
return ERROR;
T->data = ch; //输入结点的数值
CreatTree(T->lchild);
CreatTree(T->rchild);
}
return OK;
}
/*********先序遍历***********/
void PreOrderTraverse(BiTree &T)
{
if(T)
{
printf("%c ",T->data); //输出根结点
PreOrderTraverse(T->lchild); // 输出左子树
PreOrderTraverse(T->rchild); //输出右子树
}
}
/*********中序遍历***********/
void InOrderTraverse(BiTree &T)
{
if(T)
{
InOrderTraverse(T->lchild); //输出左子树
printf("%c ",T->data); //输出根结点
InOrderTraverse(T->rchild); //输出右子树
}
}
/**********后序遍历***********/
void PostOrderTraverse(BiTree &T)
{
if(T)
{
PostOrderTraverse(T->lchild); //输出左子树
PostOrderTraverse(T->rchild); //输出右子树
printf("%c ",T->data); //输出根结点
}
}
/*********层序遍历***********/
void LevelOrderTraverse(BiTree T)
{
BiTree Q[MaxLength]; // 结点数不超过10个
int Front=0,rear=0;
BiTree p;
if(T)
{
Q[rear]=T; //队尾插入根结点元素
rear=(rear+1)%MaxLength; //队尾下标rear后移
}
while(Front!=rear)
{
p=Q[Front]; //队头元素出队
Front=(Front+1)%MaxLength;//队头下标Front后移一位
printf("%c ",p->data);
if(p->lchild)
{ //左孩子不为空,入队
Q[rear]=p->lchild;
rear=(rear+1)%MaxLength;
}
if(p->rchild)
{ //右孩子不为空,入队
Q[rear]=p->rchild;
rear=(rear+1) % MaxLength;
}
}
}
/************树的深度***********/
int BTDepth(BiTree T)
{//求二叉树的深度
if(!T)
return 0;
else
{
int lh=BTDepth(T->lchild); //判断左子树的深度
int rh=BTDepth(T->rchild); // 判断右子树的深度
if(lh>rh) //判断左右子树哪个深度大
return lh+1;
else
return rh+1;
}
}
int main()
{
BiTree tree;
int high;
/********创建树功能*********/
if(CreatTree(tree))
{
/*******先序遍历结果*********/
printf("先序遍历树结果:");
PreOrderTraverse(tree);
printf("\n\n");
/*******中序遍历结果*********/
printf("中序遍历树结果:");
InOrderTraverse(tree);
printf("\n\n");
/********后序遍历结果********/
printf("后序遍历树结果:");
PostOrderTraverse(tree);
printf("\n\n");
/********层序遍历************/
printf("层序遍历树的结果:");
LevelOrderTraverse(tree);
printf("\n\n");
/********树的深度************/
printf("树的深度为为:");
high = BTDepth(tree);
printf("%d\n\n",high);
}else
{
printf("创建树失败!\n");
}
return 0;
}
树--递归实现先、中、后遍历,层序遍历和树的深度
最新推荐文章于 2023-10-22 17:52:13 发布