0
点赞
收藏
分享

微信扫一扫

687. Longest Univalue Path*

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;
}
};


举报

相关推荐

0 条评论