/**
* 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;
* }
* }
*/classSolution{int ans =0;publicintdiameterOfBinaryTree(TreeNode root){// 跑结果,维护ansmaxDepth(root);return ans;}// 函数功能:返回 root 可达的最深层// 可以遍历所有结点的最长直径intmaxDepth(TreeNode root){if(root ==null){return0;}// 取左右子结点的可达最深层int right =maxDepth(root.right);int left =maxDepth(root.left);// 在这个过程中,维护ans:ans一定是某个结点的左右子树结合成的。
ans =Math.max(ans, right + left);// root的maxDepth就是左 or 右的 maxDepth + 1returnMath.max(right,left)+1;}}
时间复杂度O(n),自底向上把全部结点遍历了一遍。
无注释版
classSolution{int ans =0;publicintdiameterOfBinaryTree(TreeNode root){dfs(root);return ans;}publicintdfs(TreeNode root){if(root ==null){return0;}int left =dfs(root.left);int right =dfs(root.right);
ans =Math.max(left + right, ans);returnMath.max(left, right)+1;}}