leetcode:104. 二叉樹的最大深度 - 力扣(LeetCode)
思路:遞迴判斷每次左右節點的是否存在,存在自然加一,return的1就是這樣,判斷子節點的左右兩端是否有節點,統計有的節點數量,也就是左右的高度
class Solution { public int maxDepth(TreeNode root) { //後序遍歷 if( root == null) return 0; int leftheight = maxDepth(root.left); int rightheight = maxDepth(root.right); return 1+Math.max(leftheight,rightheight); } }
leetcode:111. 二叉樹的最小深度 - 力扣(LeetCode)
思路:後序遍歷,唯一不同點在最小子節點不能把null算上,分類討論左右節點分別為null的情況
class Solution { public int minDepth(TreeNode root) { if(root == null) return 0; int leftheight = minDepth(root.left); int rightheight = minDepth(root.right); //和最大深度不同的是,節點為空時,不能算作子節點,所以要分類討論左右節點為空的情況 if(root.left == null && root.right != null) return 1+rightheight; if(root.left != null && root.right == null) return 1+leftheight; return 1 + Math.min(leftheight,rightheight); } }
leetcode:559. N 叉樹的最大深度 - 力扣(LeetCode)
思路:和二叉樹左右節點思路一致,唯一區別在多個子節點,使用陣列判斷每個節點的子節點的深度,兩兩比較最大值
class Solution { public int maxDepth(Node root) { if(root == null) return 0; int n = 0; //判斷上一個和現在children的深度 for(Node child : root.children){ n = Math.max(n,maxDepth(child)); } return n + 1; } }
leetcode:222. 完全二叉樹的節點個數 - 力扣(LeetCode)
思路:判斷左右子節點的數目是否相同,相同利用公式快速記錄滿叉樹節點數目,剩下的正常記錄,遞迴真好用,
class Solution { public int countNodes(TreeNode root) { if(root == null)return 0; TreeNode left = root.left; TreeNode right = root.right; int leftlen = 0; int rightlen = 0;
//記錄兩邊左右節點數目 while(left != null){ left = left.left; leftlen++; } while(right != null){ right = right.right; rightlen++; } //成立說明是滿叉樹,直接帶入公式 if(leftlen == rightlen) return (2 <<leftlen ) - 1; int leftsum = countNodes(root.left); int rightsum = countNodes(root.right); return 1 + leftsum + rightsum; } }