二叉树的最大/小深度的递归与非递归实现
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; }
相关文章推荐
- 二叉树的遍历与求深度的递归与非递归实现
- 【LeetCode笔记】Maximum Depth of Binary Tree 二叉树最大深度 递归&非递归
- [java] 二叉树的后序遍历(递归与非递归实现)
- 二叉树深度优先(DFS)和广度优先(BFS)算法的非递归实现
- 详细讲解二叉树三种遍历方式的递归与非递归实现
- 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 二叉树的创建,遍历,查找,查找父节点,深度,大小等的递归实现
- 二叉树创建、前序遍历、中序遍历、后序遍历 的 递归与非递归实现 以及 层次遍历
- 【二叉树的递归】02二叉树的最大深度【Maximum Depth of Binary Tree】
- 【基础备忘】二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- 用非递归实现二叉树的前序、中序、后序、层次遍历,用递归实现查找、统计个数、比较、求深度
- 二叉树的先序遍历 很有想法的递归与非递归实现
- 面试题16:递归计算二叉树的最大、最小深度
- 递归与非递归实现二叉树
- Java实现二叉树的先序、中序、后序、层次遍历,数的最大深度、最大宽度
- 二叉树的先序创建,先序,中序,后序的递归与非递归遍历,层次遍历,叶子结点数及树的深度
- 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- 结点遍历C语言实现二叉树的常用的算法(递归与非递归实现遍历)