问题:
给定一棵二叉树,找到路径中每个节点具有相同值的最长路径的长度。此路径可能会也可能不会通过根。
两个节点之间的路径长度由它们之间的边数表示。
对此的解决方案是:
class Solution
{
public:
int max_len = INT_MIN;
int longestUnivaluePath(TreeNode* root)
{
if(!root)
return 0;
helper(root, root->val);
return max_len;
}
int helper(TreeNode* root, int prev_value)
{
if(!root)
return 0;
int left = helper(root->left, root->val);
int right = helper(root->right, root->val);
max_len = std::max(left + right, max_len); // Why do we do this? I have no idea
if(root->val == prev_value)
return std::max(left, right) + 1;
return 0;
}
};
我们为什么要这样做:max_len = std::max(left + right, max_len);
这部分对我来说没有意义。如果有人能真正解释一下,我将不胜感激。
答案 0 :(得分:3)
最长的路径不必严格地下降,对吗?例如,以下树中最长的单值路径的长度为2:
3
/ \
3 3
在他们的算法中,
left
是沿着node
左分支的最长 descending 单值路径的长度。
right
是沿node
右分支向下的最长下降单值路径的长度。
left + right
组合起来是通过 节点node
的最长单值路径的长度,这是新的候选路径。
所以这行实际上是指
max_len = std::max(candidate_len, max_len);
这是一种规范的运行最大值算法:它逐个顺序地依次处理候选值,并保持到目前为止在max_len
中看到的最大值。最终,max_len
将以所有候选者的最大值结束。