关于求解树的最小深度问题

转载请附上本文链接

这是一道典型的递归题;

特殊情况:(树为空:深度为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;
}
点击打开博主博客链接

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值