【专题四】求二叉树深度的递归与非递归写法

//求二叉树深度  递归写法
int deep1(BTNode *T)
{
	if(T==NULL)
		return 0;
	int lhight = deep1(T->lchild)+1;//左子树高度
	int rhight = deep1(T->rchild)+1;//右子树高度
	return lhight>rhight?lhight:rhight; //返回最大的高度	
} 

//求二叉树深度  非递归写法  
/**
算法思想:设置一个level指针指向当前遍历的层数,
    每次遍历到当前层最右边的一个结点后,就将level指针+1,即开始遍历下一层。
 	遍历完所有结点后level的大小就该树的高度。 
**/
int deep2(BTNode *T)
{	 
	if(T==NULL)
		return 0;
	int level,rear,front,last;//指向当前遍历到的层数	
	rear = front = -1;
	last = level = 0;  //last表示当前遍历所在层的最右结点在队列中的位置。 
	/**
	初始时rear和front为0,而last为0的原因,是因为初始时根结点入队,且数组队列是从下标为0开始存数据的,que[0]中存储的是第一层的最右边结点。
		如果初始时,rear = front = 0;last=1,也是可以的。这表示从下标为1开始存数据,que[1]存储的是第一层的最右边的结点 
	*/ 
	BTNode *que[maxSize],*q;
	que[++rear] = T;//根结点先入队
	//开始层序遍历所有结点 
	while(front<rear) //如果队列不为空,即结点没被遍历完就一直循环遍历 
	{
		q = que[++front]; //队首元素出队

		if(q->lchild!=NULL)//该元素有左孩子则将左孩子入队 
			que[++rear] = q->lchild; 
			
		if(q->rchild!=NULL)//该元素有右孩子则将左孩子入队 
			que[++rear] = q->rchild; 
			
		if(front == last)  //如果遍历到了该层的最右结点,则处理level指针
		{
			last = rear;//将last指向下一层的最右边结点,而执行完前面的孩子入队操作后,rear指向的就是队尾,所以将rear赋给last 
			++level;//将level指向下一层 
		} 
	} 
	return level;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值