解題思路:
剛開始想到的就是利用回溯,樹的最小深度等於樹的左右子樹的最小深度+1;
根據這個想法,寫出解題算法
public class Solution { public int run(TreeNode root) { TreeNode node = root; //遞歸的邊界條件 如果當前節點為null 高度為0 if(node == null) return 0; //遞歸的邊界條件 如果當前節點是葉子節點(左右子樹都為null),高度是1 if(node.left == null && node.right == null){ return 1; } //否則 左右節點有值 當前節點高度(只看當前節點)為1+ 那個不為null的子樹的高度,因此為max if(node.left == null || node.right == null){ return 1 + Math.max(run(node.left), run(node.right)); } //最后是都不為空 1+左右子樹的最小高度 return 1 + Math.min(run(node.left), run(node.right)); } }
另一種非遞歸的方法是層序遍歷,從根節點開始,從上往下,利用一個隊列存放需要遍歷的節點,
代碼:
public int run(TreeNode root) { if(root ==null) return 0; Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); int depth = 0;//當前樹的深度 while(!queue.isEmpty()){ int size = queue.size(); //這個地方是關鍵,獲取當前層需要遍歷的節點個數 for(int i = 0; i < size; i++){ TreeNode current = queue.poll(); if(current.left == null && current.right == null) //如果左右子樹都為空 return 1 + depth; if(current.left != null){ queue.offer(current.left); } if(current.right != null){ queue.offer(current.right); } } depth++; } return depth; }