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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值