描述
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
示例1
输入:
{1,2,3,4,5,#,6,#,#,7}
返回值:4
题目链接:
解析:
这里使用的非递归方法,他是在层次遍历的基础上进行改进而来的,每当一层遍历结束,树的高度+1,
- 那我们如何判断每一层遍历结束呢?
- 可以先记录一层的节点数量,在这一层每遍历到一个节点,就减少当前层元素数量,直到为0
- 那怎么记录到下一层的节点个数呢?
- 注意到每一层的最后一个节点被遍历(并出队列)后,当前队列中只会留下下一层全部的节点。那么下一层元素数量就可以被记录下来了!
import java.util.*;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public int TreeDepth(TreeNode root) {
if (root == null) return 0;
// 树的高度
int height = 0;
// 存储着每一层的元素数量
int levelSize = 1;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
levelSize--; //每当一层最后一个节点出队列,意味着此时队列中只有下一层的节点了
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
if (levelSize == 0) { // 意味着即将要访问下一层
levelSize = queue.size();
height++;
}
}
return height;
}
}
递归
public int TreeDepth(TreeNode root) {
if(root==null){
return 0;
}
int left=TreeDepth(root.left);
int right=TreeDepth(root.right);
return Math.max(left,right)+1;
}