递归方式
递归方式的求解过程很简单,只需要将问题分解。
首先,递归出口是什么?毫无疑问,当树节点为空时,我们就可以结束递归了。
那么当前树的高度和其左子树及右子树的关系是什么呢?树的高度,定义为从根节点到叶子节点的最长路径;因此当前树深应该是自身节点所占的一层高度加上左右子树中深的高度。
因此,有一下递归方式求解算法。
/*******************
* 递归求解二叉树的深度
* @param root 二叉树的根节点
* @return 二叉树的深度
*/
public static int getTreeDepthByRecu(TreeNode root)
{
//空树
if(root==null)
{
return 0;//空树深度为零
}
//并不是空树
int leftDepth=getTreeDepthByRecu(root.left);//递归求解左子树深度
int rightDepth=getTreeDepthByRecu(root.right);
//当前树的深度就是左右子树深度大的那一个深度 加上节点本身的深度
return leftDepth>rightDepth?leftDepth+1:rightDepth+1;
}
非递归方式
在二叉树的遍历时,我们提到过一种层次遍历的方式,这种方式分层按照一层一层的方式读取节点,如果我们能将这个过程中读取了多少层记录下来,那么,也可以得到树的深度。
https://blog.csdn.net/weixin_43823363/article/details/87947957 二叉树的遍历
/************************
* 非递归求解树的深度
* @param root 二叉树的根节点
* @return 二叉树的深度
*/
public static int getTreeDepth(TreeNode root)
{
if(root==null)//根节点为空 返回0
{
return 0;
}
//使用层次遍历的方式 遍历整棵树 求解树的深度
//初始化
int treeHigh=0;// 树高
int nextCount=1;//还未进行遍历的下一层的节点数
int count=0;//当前层中已经遍历的节点数
LinkedList<TreeNode> queue=new LinkedList<>();//LinkList实现了Queue接口 可以当做队列使用
//将根节点加入队列中
queue.add(root);
while(!queue.isEmpty())//队列非空未遍历完成
//一次循环遍历即为查找一个节点
{
count++;
TreeNode node=queue.poll();//弹出队列中的头结点
//判断左右节点是否为null不为空则加入队列
if(node.left!=null)
{
queue.add(node.left);
}
if(node.right!=null)
{
queue.add(node.right);
}
//当前遍历的节点数和当前层的节点数相等时
//即一层的节点遍历完成
if(count==nextCount)
{
nextCount=queue.size();//此时队列中节点数量即为下一层中的节点数量
count=0;//置下一层中已经遍历的节点数量为0
treeHigh++;//遍历完一层 树高加1
}
}
return treeHigh;
}