LeetCode 671
2020.8.17
我的通过代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int longestUnivaluePath(TreeNode root) {
if(root==null) return 0;
if(root.left!=null&&root.right!=null&&root.val == root.left.val&&root.val == root.right.val)
return Math.max(2+traverse(root.left)+traverse(root.right),Math.max(longestUnivaluePath(root.left),longestUnivaluePath(root.right)));
return Math.max(traverse(root),Math.max(longestUnivaluePath(root.left),longestUnivaluePath(root.right)));
}
int traverse(TreeNode root) {
if(root==null||(root.left==null&&root.right==null)) return 0;
if(root.left==null&&root.right!=null&&root.val==root.right.val) return 1+traverse(root.right);
if(root.left!=null&&root.right==null&&root.val == root.left.val) return 1+traverse(root.left);
if(root.left!=null&&root.right!=null) {
if(root.val == root.left.val&&root.val == root.right.val)
return Math.max(1+traverse(root.left),1+traverse(root.right));
if(root.val == root.left.val) return 1+traverse(root.left);
if(root.val == root.right.val) return 1+traverse(root.right);
}
return 0;
}
}
暴力归暴力,反正做出来了。
这题目,挺麻烦的。
一开始我只看了题目和示例1,对于题目中“这条路径可以不经过根节点”这句话的理解是,这条路径可以像下图中的 “5—5” 这样:
在我第一次提交答案错误后,我看了示例二,才发现这句话也包括下图这种路径:
。。。。
这就很麻烦了。
因为这种分叉,只在第一个分叉时需要记录两边各自的最长路径值并相加,此后再遇到时就不需要再这样记录了,因为如果每次都记录,那么肯定构成不了一条路径。
为了避免这些麻烦的情况,我的代码里多了一对判断。好在最后的结果是对的。
官方题解
在处理上图那种情况时,官方题解的思路就非常优秀,先上代码:
class Solution {
int ans;
public int longestUnivaluePath(TreeNode root) {
ans = 0;
arrowLength(root);
return ans;
}
public int arrowLength(TreeNode node) {
if (node == null) return 0;
int left = arrowLength(node.left);
int right = arrowLength(node.right);
int arrowLeft = 0, arrowRight = 0;
if (node.left != null && node.left.val == node.val) {
arrowLeft += left + 1;
}
if (node.right != null && node.right.val == node.val) {
arrowRight += right + 1;
}
ans = Math.max(ans, arrowLeft + arrowRight);
return Math.max(arrowLeft, arrowRight);
}
}
从根节点出发,有三种情况,分别是最长同值路径在左子树上,最长同值路径在右子树上和最长同值路径在左子树+根+右子树上。
不论第三种情况会不会发生,为了判断前两个,都必须分别计算左右子树上可能出现的同值路径的长度。
这之后再进行比较,便可以知道会不会出现上图那种离谱的情况,从而得到最终的答案。
很妙。
上述题解来源于LeetCode
链接:https://leetcode-cn.com/problems/longest-univalue-path/solution/zui-chang-tong-zhi-lu-jing-by-leetcode/