您的位置:首页 > 其它

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

2018-12-15 19:31 302 查看

二叉树结构体定义

//二叉树结构体定义
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐