111. 二叉樹的最小深度
知識點:二叉樹,遞迴
題目描述
給定一個二叉樹,找出其最小深度。
最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。
說明:葉子節點是指沒有子節點的節點。
示例
輸入:root = [3,9,20,null,null,15,7]
輸出:2
輸入:root = [2,null,3,null,4,null,5,null,6]
輸出:5
解法一:遞迴法
函式功能:求一顆二叉樹的最小深度
1.終止條件:root == null, return 0;
2.該做什麼:此題和最大深度的區別是什麼,最大深度只要取兩顆樹裡最大的就可以了,但是最小深度不同,比如如果其左子樹或右子樹為空的時候,只能去遞迴呼叫它的孩子,如果兩個孩子都有,那就可以取兩個裡面小的深度+1了。
3.什麼時候做,在呼叫下面的子樹的時候我們需要先判斷,所以先序。
此題不能像最大深度那樣直接求兩顆子樹的最大然後+1,最大深度可以是因為取大值不會影響一棵樹為空的時候。但是取最小就不一樣了,如果一棵樹為空,那最小的應該是不為空的那邊的值,但是還按原來方式就變成了0+1;所以,在處理每一個節點的時候,如果有兩個孩子,那就可以繼續取小+1,如果只有一個孩子,那就只能去遞迴它的孩子。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int minDepth(TreeNode root) {
if(root == null) return 0;
if(root.left == null && root.right == null) return 1;
if(root.left == null && root.right != null) return minDepth(root.right)+1;
if(root.right == null && root.left != null) return minDepth(root.left)+1;
return Math.min(minDepth(root.left), minDepth(root.right))+1;
}
}
解法二:層次遍歷(BFS)
利用佇列的結構,一層一層的遍歷;節點不停的出隊入隊,每遍歷一個節點的時候,將其左節點和右節點入隊。注意在遍歷的時候判斷節點是否有孩子,如果沒孩子了,那就可以返回了。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int minDepth(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
if(root == null) return 0;
queue.add(root);
int level = 0;
while(!queue.isEmpty()){
level++;
int levelNum = queue.size();
for(int i = 0; i < levelNum; i++){
TreeNode front = queue.poll();
if(front.left == null && front.right == null) return level;
if(front.left != null) queue.add(front.left);
if(front.right != null) queue.add(front.right);
}
}
return level;
}
}