题目
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
第一次写的代码,我觉得逻辑性不够强
写法一:DFS
int min = Integer.MAX_VALUE;
public int minDepth(TreeNode root) {
if (root == null) {
return 0;
}
// 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
dfs(root, 1);// 对不起我看错题了 ,是求节点的数量!!
return min;
}
public void dfs(TreeNode root, int sum) {
if (root.left == null && root.right == null) {
min = Math.min(min, sum);
return;
}
if (root.left != null) {
dfs(root.left, sum + 1);
}
if (root.right != null) {
dfs(root.right, sum + 1);
}
}
写法二:BFS
public int minDepth2(TreeNode root) {
if (root == null) {
return 0;
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
int level = 0;
while (!queue.isEmpty()) {
level++;
int size = queue.size();// 吃一堑长一智!!
while (size-- > 0) {
TreeNode top = queue.poll();
if (top.left == null && top.right == null) {
return level;
}
if (top.left != null) {
queue.add(top.left);
}
if (top.right != null) {
queue.add(top.right);
}
}
}
return -1;
}
犯的错误有:
- int level = 0;level++;没有用level来记录,用的是size,然后size是队列的长度,随时都变,我们要求的是这棵树的深度!!!
- while (!queue.isEmpty()) ,写成while (queue.isEmpty()) 可还行???!!!
- TreeNode top = queue.poll();
int size = queue.size();
我说怎么总是返回-1,你都把元素poll出去了,size都为0 了,可还行???!!!
if (top.left == null && top.right == null) {
return level;
}
我写成了top.left == null || top.right == null,我的想法是,层序遍历,如果那一层有空的节点,就可以跳出来,返回最小值了.但是人家说的是树根到叶子节点!!叶子节点!!!,如果有空的节点,那可能这棵树就是这样构造的呢??
其实我应该是想:遍历的这层,如果出现叶子节点,说明已经找到最小深度了,就可以返回!记住叶子节点!