leedcode經典題目:二叉樹的直徑
阿新 • • 發佈:2018-12-14
今天溫習了過去解決的一些題目,發現關於二叉樹的問題還是蠻有意思的,因為它們有著很多的共同點,而且多是通過遞迴思維解決,因此也有助於我們的邏輯能力的提升,下面給大家分享兩道比較類似的二叉樹問題~ 給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。 示例:給定二叉樹 [3,9,20,null,null,15,7], 3 / 9 20 / 15 7 返回它的最大深度 3 。 這裡我分別給出了遞迴和迭代兩種求解方式:
package com.gaoxue.LeetCode; import java.util.LinkedList; import java.util.Queue; /** * 二叉樹的最大深度 * @author Administrator * */ public class MaximumDepthBinaryTree { //遞迴方式 public int maxDepth(TreeNode root) { return root == null ? 0 : (1 + Math.max(maxDepth(root.left), maxDepth(root.right))); } //迭代方式(堆疊) public int maxDepth2(TreeNode root) { if (root == null) return 0; int res = 0; Queue<TreeNode> q = new LinkedList<>(); q.offer(root); while (!q.isEmpty()) { ++res; int n = q.size(); for (int i = 0; i < n; ++i) { TreeNode t = q.poll(); if (t.left != null) q.offer(t.left); if (t.right != null) q.offer(t.right); } } return res; } public static void main(String[] args) { TreeNode root = new TreeNode(1); root.left = new TreeNode(2); root.right = new TreeNode(3); root.left.left = new TreeNode(4); root.left.right = new TreeNode(5); System.out.println(new MaximumDepthBinaryTree().maxDepth(root)); } }
給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過根結點。 示例 :給定二叉樹 1
/ \
2 3
/ \
4 5
返回 3, 它的長度是路徑 [4,2,1,3] 或者 [5,2,1,3]。 注意:兩結點之間的路徑長度是以它們之間邊的數目表示。 這裡我給出了遞迴求解方式,當然也通過迭代方式搞定,大家可以加以思考自行實現:
package com.gaoxue.LeetCode; /** * 遞迴求解二叉樹直徑 * @author Administrator * */ public class DiameterBinaryTree { int max = 0; public int diameterOfBinaryTree(TreeNode root) { maxDepth(root); return max; } private int maxDepth(TreeNode root) { if (root == null) return 0; int left = maxDepth(root.left); int right = maxDepth(root.right); max = Math.max(max, left + right); return Math.max(left, right) + 1; } public static void main(String[] args) { TreeNode root = new TreeNode(1); root.left = new TreeNode(2); root.right = new TreeNode(3); root.left.left = new TreeNode(4); root.left.right = new TreeNode(5); System.out.println(new DiameterBinaryTree().diameterOfBinaryTree(root)); } }
自己覺著這兩道題的實現區別主要就是遞迴方法引數的不同,前者以左右節點為引數比較左右部分,後者則把根節點作為引數比較全域性,當我們理清共同資訊要素後題目自然就迎刃而解啦,所以還是戒驕戒躁、砥礪前行哈~