递归法
最长同值路径
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。
示例 1:
输入:
5
/ \
4 5
/ \ \
1 1 5
输出:
2 (5->5->5 => 边数为2)
这道题其实可以看成是解决以root为路径起始点的最长路径,这其实就只有两种情况:
(1)第一种是root和左子树(同值)

(2) 第二种是root和右子树(同值)

但是还有种特殊情况,就是左子树-root-右子树(同值),但是这种特殊情况不影响我们递归函数的功能的设计。

int ans = 0;
public int longestUnivaluePath(TreeNode root) {
longestPath(root);
return ans;
}
//递归函数功能:搜寻以node为起点的最长同值路径:
//要么是以node为起点的左子树,要么是以node为起点的右子树
private int longestPath(TreeNode node) {
if (node == null) return 0;
int maxLorRres = 0;
TreeNode left = node.left, right = node.right;
int lval = longestPath(left); //node左子树的最长同值路径
int rval = longestPath(right); //node右子树的最长同值路径
//这种情况对于寻找最长同值路径长有帮助,对于搜索以root为路径起始点的最长路径没有帮助
if (left != null && left.val == node.val && right != null && right.val == node.val) {
ans = Math.max(ans, lval + rval + 2); //因为求路径(两点之间的边数),所以加2
}
//从左右子树中选择最长的同值路径
if (left != null && left.val == node.val)
maxLorRres = Math.max(maxLorRres, lval + 1);
if (right != null && right.val == node.val)
maxLorRres = Math.max(maxLorRres, rval + 1);
ans = Math.max(ans, maxLorRres);
return maxLorRres;
}
Comments | 0 条评论