LeetCode 687 Longest Univalue Path
思路
本题的难点在与如何处理left-root,right-root和left-root-right型path。
另一个关键点在于递归函数的意义是:以root为根的子树中,以root为起点的最长path或left-root-right型的最长path。因此,才需要一个全局变量来记录最长路径。
-
递归的返回值为left-root或right-root型路径的长度,递归函数的参数length采用传引用方式,全程记录最长路径。
-
递归函数返回一个数组,数组的第一个元素是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;
};