38、二叉树的深度
解题思路:
题目是 从根节点到叶节点的路径,所以就是求出二叉树的层数即可。
方法一:层次遍历
我们先来回顾一下二叉树的层次遍历,一般我们都是用队列去实现的。
步骤:
1、先创建一个队列,将根节点入队;
2、队列不为空,进入循环:
- 出队一个节点
- 将当前节点的左右节点入队(不为空时)
- 此时当前层的所有节点的左右子节点都入队
4、最后当队列中无节点的时候,此时已全部遍历完全部节点。
有了上面的步骤,我们只需要在每一层的所有节点的左右子节点都入完队的时候,就计数,最后则可以得到结果。
代码:
public int TreeDepth(TreeNode root) {
if(root == null)
return 0;
Queue<TreeNode> q = new LinkedList<>();
// 根节点入队
q.add(root);
// 记录深度
int high = 0;
// 当队列不为空的时候
while(!q.isEmpty()){
// 当前层的节点数
int size = q.size();
// 将当前层的节点的左右子节点都入队
while(size != 0){
// 出队
TreeNode node = q.poll();
// 有左节点的时候
if(node.left != null)
q.add(node.left);
// 有右节点的时候
if(node.right != null)
q.add(node.right);
// 出一个
size--;
}
// 里层循环结束则证明一走完一层,所以深度加1
high++;
}
return high;
} 复杂度分析:
时间复杂度:O(n)。 节点的个数。
空间复杂度:O(n)。队列占用的空间。
方法二:深度遍历
我们知道二叉树的深度,肯定是等于其左子树与右子树的深度的最大值再+1。(加1就是加上当前层)
深度遍历可以采用栈或者递归实现,本文采用递归的做法实现,代码很简单易懂。
当递归到节点为null的时候,则为终止条件,此时会返回0。
接着会取左右子树中最大值+1。
例子:
假设父节点F,左节点为L,L的左右节点都为null。
则此时父节点F的左子树的深度则为1。
代码:
public int TreeDepth(TreeNode root) {
if(root == null)
return 0;
int l = TreeDepth(root.left);
int r = TreeDepth(root.right);
return Math.max(l,r)+1;
} 复杂度分析:
时间复杂度:O(n)。 遍历的节点的个数。
空间复杂度:O(n)。退化成链表的时候,则递归深度为n。

京公网安备 11010502036488号