个人认为这么一个层序遍历的章节放这么多基本一样的题目算是很没意思的了?
填充每个节点的下一个右侧节点和二叉树最大深度和前面的代码几乎完全一样,所以我就跳过了
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:2
示例 2:
输入:root = [2,null,3,null,4,null,5,null,6] 输出:5
提示:
[0, 105]
?内-1000 <= Node.val <= 1000
思路
这道题目如果还用层序遍历去做的话基本就是在模板上面略作修改即可,我在这道题目上关注的还是它的递归解法也就是深度优先搜索。
这道题目要找一个深度最浅的叶子节点,即左右儿子皆为空,所以我们的递归结束条件即为left==right==null,而我们又需要找一个最浅的,所以当左右两侧节点均非空时,递归的返回值应当是分别对两者进行递归后的较小值加1.
class Solution {
public int minDepth(TreeNode root) {
if(root==null){
return 0;
}
if(root.left==null&&root.right==null){
return 1;
}
int m1=minDepth(root.left);
int m2=minDepth(root.right);
if(root.left==null||root.right==null){
return m1+m2+1;
}
return (m1>m2?m2:m1)+1;
}
}
其中,若是节点有一个儿子为空,则直接返回非空递归值加一即可。
层序遍历的思路就是将当前层的节点加入队列,然后将队首的子节点加入队尾,再将队首出队,不断循环直到队列为空。
public void checkFun02(TreeNode node) {
if (node == null) return;
Queue<TreeNode> que = new LinkedList<TreeNode>();
que.offer(node);
while (!que.isEmpty()) {
List<Integer> itemList = new ArrayList<Integer>();
int len = que.size();
while (len > 0) {
TreeNode tmpNode = que.poll();
itemList.add(tmpNode.val);
if (tmpNode.left != null) que.offer(tmpNode.left);
if (tmpNode.right != null) que.offer(tmpNode.right);
len--;
}
resList.add(itemList);
}
}
但是迭代法还需要进行练习。