这是一道典型的递归题;
特殊情况:(树为空:深度为0和树只有根结点深度为1)
后讨论其他情况;区分双子树和单子树
单子树:1左子树为空,右子树不空,深度为右字数深度+1
2右子树为空,左子树不为空,深度为左子树深度+1
(左/右子树深度由递归调用函数求出)
双子树:左右子树均不为空,取深度为左右子树中的小值+1
奉上代码如下:
#include<stdio.h>
#include<malloc.h>
#define maxsize 100
typedef struct lnode
{
char data;
struct lnode *lchild;
struct lnode *rchild;
}btnode;
void creatbtree(btnode *&b,char *str)//创建二叉树
{
int k,j=0;
int top=-1;
btnode *st[maxsize];//st是用于保存双亲结点的栈
btnode *p;
char ch;
b=NULL;//初始为空的二叉树
ch=str[j];
while(ch!='\0')
{
switch(ch)
{
case '(':top++;st[top]=p;k=1;break;//p进栈,k=1(处理左子树)
case ')':top--;break;//退栈
case ',':k=2;break;//处理右字数
default:
p=(btnode *)malloc(sizeof(btnode));//遇到其他情况(字符等)
p->data=ch;//存放数据
p->lchild=p->rchild=NULL;
if(b==NULL)//若还未创建根节点
b=p;
else//已经有了更结点
{
switch(k)
{
case 1:st[top]->lchild=p;break;//p作为双亲结点的左子树
case 2:st[top]->rchild=p;break;//右
}
}break;
}
j++;
ch=str[j];
}
}
int f2(btnode *b)//求树的最小深度
{
int h;//树的最小深度
if(b==NULL)
h=0;
else if(b->lchild==NULL&&b->rchild==NULL)//若没有子树
h=1;
else if(b->lchild==NULL&&b->rchild!=NULL)//如果左子树为零,取左子树深度
h=f2(b->rchild)+1;
else if(b->lchild!=NULL&&b->rchild==NULL)//如果右子树为零 ,取右子树深度
h=f2(b->lchild)+1;
else//其他情况,取最小值
h=(f2(b->rchild)+1)<(f2(b->lchild)+1)?(f2(b->rchild)+1):(f2(b->lchild)+1);
return h;
}
void destroybtnode(btnode *b)
{
if(b!=NULL)
{
destroybtnode(b->lchild);
destroybtnode(b->rchild);
free(b);
}
}
int main()
{
btnode *b;
char a[1000];
gets(a);//输入字符
creatbtree(b,a);
int h=f2(b);
printf("输出最小深度");
printf("%d",h);
destroybtnode(b);
return 0;
}
点击打开博主博客链接