Leetcode问题以找到最长的单值路径

时间:2019-08-29 16:40:31

标签: c++ binary-tree

问题:

  

给定一棵二叉树,找到路径中每个节点具有相同值的最长路径的长度。此路径可能会也可能不会通过根。

     

两个节点之间的路径长度由它们之间的边数表示。

source

对此的解决方案是:

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);这部分对我来说没有意义。如果有人能真正解释一下,我将不胜感激。

1 个答案:

答案 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将以所有候选者的最大值结束。