LeetCode 687 Longest Univalue Path

96 阅读1分钟

LeetCode 687 Longest Univalue Path

思路

本题的难点在与如何处理left-root,right-root和left-root-right型path。
另一个关键点在于递归函数的意义是:以root为根的子树中,以root为起点的最长path或left-root-right型的最长path。因此,才需要一个全局变量来记录最长路径。

  1. 递归的返回值为left-root或right-root型路径的长度,递归函数的参数length采用传引用方式,全程记录最长路径。

  2. 递归函数返回一个数组,数组的第一个元素是left-root或right-root型路径,第二个元素是left-root-right型路径,全程用一个变量记录最长路径。

代码

方法1

class Solution {
public:
    int longestUnivaluePath(TreeNode* root) {
        int length = 0;
        
        if (root) 
            DFS(root, length);
        
        return length;
    }
    
    int DFS (TreeNode *root, int &length) {
        int leftChild = root->left ? DFS(root->left, length) : 0;
        int rightChild = root->right ? DFS(root->right, length) : 0;
        int rootToLeft = root->left && root->left->val == root->val ? leftChild + 1 : 0;
        int rootToRight = root->right && root->right->val == root->val ? rightChild + 1 : 0;
        length = max(length, rootToLeft + rootToRight);
        return max(rootToLeft, rootToRight);
    }
};

方法2

class Solution {
public:
    int longestUnivaluePath(TreeNode* root) {
        if (!root) return 0;
        
        DFS(root);
        
        return maxLen;
    } 
    
    vector<int> DFS(TreeNode *root) {
        if (!root) return {0, 0};
        
        auto left = DFS(root->left);
        auto right = DFS(root->right);
        vector<int> rs{0, 0};
        
        if (root->left && root->val == root->left->val) ++left[0];
        else left[0] = 0;
        if (root->right && root->val == root->right->val) ++right[0];
        else right[0] = 0;
        
        rs[0] = max(left[0], right[0]);
        if (root->left && root->right && root->val == root->left->val && root->val == root->right->val) 
            rs[1] = left[0] + right[0];
        
        maxLen = max({maxLen, rs[0], rs[1]});
        
        return rs;
    }
private:
    int maxLen = 0;
};