687. Longest Univalue Path*
https://leetcode.com/problems/longest-univalue-path/
题目描述
C++ 实现 1
该题的程序结构有点像 543. Diameter of Binary Tree*
在下面代码中, 我们使用 path_length(root)
这个函数来统计以 root
为起点的 Univalue Path 的最长是多少. 基本思路上, 求左右子树的最大长度, 然后判断左右孩子是否和 root 的值相等, 并更新以 root 为起点的最大长度.
但是, 该函数的返回值不是题目要求的结果, 因为如果 root 的值和左右孩子都相等, 那么 Univalue Path 的长度可以是左右子树的最大长度之和. 所有还会利用一个全局变量, 保存在递归过程中遇到的 longest univalue path.
具体都在代码里, 用文字描述难度较大. 本题解答参考: https://leetcode.com/problems/longest-univalue-path/solution/
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
int max_length = 0;
int path_length(TreeNode *root) {
if (!root) return 0;
auto a = path_length(root->left);
auto b = path_length(root->right);
int path_left = 0, path_right = 0;
if (root->left && root->left->val == root->val)
path_left += a + 1;
if (root->right && root->right->val == root->val)
path_right += b + 1;
max_length = std::max(max_length, (path_left + path_right));
return std::max(path_left, path_right);
}
public:
int longestUnivaluePath(TreeNode* root) {
if (!root) return 0;
path_length(root);
return max_length;
}
};