|
| 1 | +package pp.arithmetic.leetcode; |
| 2 | + |
| 3 | +import javafx.util.Pair; |
| 4 | +import pp.arithmetic.model.TreeNode; |
| 5 | + |
| 6 | +/** |
| 7 | + * Created by wangpeng on 2019-09-03. |
| 8 | + * 543. 二叉树的直径 |
| 9 | + * |
| 10 | + * 给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。 |
| 11 | + * |
| 12 | + * 示例 : |
| 13 | + * 给定二叉树 |
| 14 | + * |
| 15 | + * 1 |
| 16 | + * / \ |
| 17 | + * 2 3 |
| 18 | + * / \ |
| 19 | + * 4 5 |
| 20 | + * 返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。 |
| 21 | + * |
| 22 | + * 注意:两结点之间的路径长度是以它们之间边的数目表示。 |
| 23 | + * |
| 24 | + * 来源:力扣(LeetCode) |
| 25 | + * 链接:https://leetcode-cn.com/problems/diameter-of-binary-tree |
| 26 | + * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 |
| 27 | + */ |
| 28 | +public class _543_diameterOfBinaryTree { |
| 29 | + |
| 30 | + public static void main(String[] args) { |
| 31 | + _543_diameterOfBinaryTree diameterOfBinaryTree = new _543_diameterOfBinaryTree(); |
| 32 | + TreeNode root = new TreeNode(1); |
| 33 | + root.left = new TreeNode(2); |
| 34 | + root.right = new TreeNode(3); |
| 35 | + root.left.left = new TreeNode(4); |
| 36 | + root.left.right = new TreeNode(5); |
| 37 | + |
| 38 | + System.out.println(diameterOfBinaryTree.diameterOfBinaryTree(root)); |
| 39 | + |
| 40 | + } |
| 41 | + |
| 42 | + private int ret = 0; |
| 43 | + |
| 44 | + /** |
| 45 | + * 解题思路: |
| 46 | + * 对于树的问题,正常思路就是遍历,此题也不例外 |
| 47 | + * 如题所示,找到最长的路径,有两种可能: |
| 48 | + * 一、根节点+左右子树节点 |
| 49 | + * 二、根节点+最长的子树节点作为其父节点的子节点 |
| 50 | + * 递归遍历过程中,用一个全局变量保存遍历过程中的最大值 |
| 51 | + * |
| 52 | + * @param root |
| 53 | + * @return |
| 54 | + */ |
| 55 | + public int diameterOfBinaryTree(TreeNode root) { |
| 56 | + dfs(root); |
| 57 | + return ret; |
| 58 | + } |
| 59 | + |
| 60 | + private int dfs(TreeNode root) { |
| 61 | + if (root == null) return 0; |
| 62 | + int left = dfs(root.left); |
| 63 | + int right = dfs(root.right); |
| 64 | + int count = left + right; |
| 65 | + ret = Math.max(ret, count); |
| 66 | + return Math.max(left, right) + 1; |
| 67 | + } |
| 68 | +} |
0 commit comments