【问题描述】
采用二叉链表作为二叉树的存储结构实现各项功能
【任务要求】
(1) 输入二叉树的先序序列,建立二叉树;
(2) 用程序实现二叉树的中序遍历;
(3) 编写程序求二叉树的深度;
【测试数据】
测试数据:(1)输入先序遍历-+a##*b##-c##d##/e##f##;查看其中序遍历、后序遍历和该二叉树的深度。
(2)输入先序遍历ab#d##ce###;查看其中序遍历、后序遍历和该二叉树的深度。
注:掌握树的先序递归创建。
代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
char data;//结点
struct node *lchild, *rchild;//左子树,右子树
}STU;
STU *Createtree()
{
STU *T;
char ch;
scanf("%c", &ch);//输入结点
if (ch == '#')//输入的是虚结点
T = NULL;//为空
else
{
T = (STU *)malloc(sizeof(STU));//动态分配空间
T->data = ch;//中
T->lchild = Createtree();//左
T->rchild = Createtree();//右
}
return T;//返回根
}
void Infixtree(STU *T)//中序遍历
{
if (T == NULL)
return;
else
{
Infixtree(T->lchild);//遍历左子树
printf("%c", T->data);//根
Infixtree(T->rchild);//右子树
}
}
void Backtree(STU *T)//后序遍历
{
if (T == NULL)
return;
else
{
Backtree(T->lchild);
Backtree(T->rchild);
printf("%c", T->data);
}
}
int Depthtree(STU *T)//深度
{
int Llen = 1, Rlen = 1;//如果根不为空,那么不管左走还是右走 至少深度为一
if (T == NULL)//根空返回深度为0
return 0;
else
{
Llen += Depthtree(T->lchild);//累加左子树
Rlen += Depthtree(T->rchild);//累加右子树
}
return Llen >= Rlen ? Llen : Rlen;//比较返回最大的一个
}
int main()
{
STU *T;
int len;
printf("输入结点创建树(虚结点用#补):");
T = Createtree();
printf("中序遍历结果:");
Infixtree(T);
printf("\n后序遍历结果:");
Backtree(T);
printf("\n树的深度为:");
len = Depthtree(T);
printf("%d\n", len);
return 0;
}