二叉树的最大/小深度的递归与非递归实现

二叉树结构体定义

//二叉树结构体定义
typedef struct BiTNode{
	ElemType data;
	struct BiTNode* lchild;
	struct BiTNode* rchild;
}BiTNode,*BiTree;

最大深度的递归算法

//最大深度的递归算法
int MaxDepth1(BiTree T){
	if(!T)
		return 0;
	else{
		int left=MaxDepth1(T->lchild);
		int right=MaxDepth1(T->rchild);
		return (left>right?left:right)+1;
	}
}

最大深度的非递归算法

算法思想
使用一个数组模拟队列实现二叉树的层次遍历;由于队列中存储的结点要么是同一层的结点,要么是相邻两层的结点,因此可以使用一个“指针”将两层结点加以区分;当每一层的第一个结点出队时,便使深度加1。
另外,也可以当每一层的最后一个结点出队时深度加1。
这里本着“类似的问题,统一的解法”思想,使用前者。

//最大深度的非递归算法
int MaxDepth2(BiTree T){
	if(!T)
		return 0;
	BiTree p,Q[MaxSize];
	int front=0,rear=0;//front:队头,rear:队尾
	int left=0,right=0;//left:第i层最左边结点,right:第i层最右边结点
	int depth=0;			             
	Q[rear++]=T;			             
	while(front!=rear){ //队列不空时循环
		if(front==left){//轮到第i层最左边的结点出队时,深度加1
			depth++;
		}
		p=Q[front++];   //结点出队,其左右孩子如果存在依次入队
		if(p->lchild)
			Q[rear++]=p->lchild;
		if(p->rchild)
			Q[rear++]=p->rchild;
		if(right<front){//第i层结点全部出队时,第i+1层结点全部入队
			right=rear-1;//调整right指向第i+1层的最右边结点
			left=front;  //调整left指向第i+1层最左边结点
		}
	}
	return depth;
}

最小深度的递归算法

//最小深度的递归算法
int MinDepth1(BiTree T){
	if(!T)
		return 0;
	if(!T->lchild)
		return MinDepth1(T->rchild)+1;
	if(!T->rchild)
		return MinDepth1(T->lchild)+1;
	int left=MinDepth1(T->lchild);
	int right=MinDepth1(T->rchild);
	return (left<right?left:right)+1;
}

最小深度的非递归算法

算法思想
同计算最大深度算法类似,采用层次遍历,遇到的第一个叶子结点所在层次即为最小深度。

//最小深度的非递归算法
int MinDepth2(BiTree T){
	if(!T)
		return 0;
	BiTree p,Q[MaxSize];
	int front=0,rear=0;
	int left=0,right=0;
	int depth=0;
	Q[rear++]=T;
	while(front!=rear){
		if(front==left){
			depth++;
		}
		p=Q[front++];
		if(!p->lchild&&!p->rchild)//遇到叶子节点,退出循环
			break;
		if(p->lchild)
			Q[rear++]=p->lchild;
		if(p->rchild)
			Q[rear++]=p->rchild;
		if(right<front){
			right=rear-1;	   
			left=front;
		}
	}
	return depth;
}

猜你喜欢

转载自blog.csdn.net/qq_39197960/article/details/85017023