[leetcode-递归]687. 最长同值路径

给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。

注意:两个节点之间的路径长度由它们之间的边数表示。

示例 1:

输入:

              5
             / \
            4   5
           / \   \
          1   1   5

输出:

2

示例 2:

输入:

              1
             / \
            4   5
           / \   \
          4   4   5

输出:

2

注意: 给定的二叉树不超过10000个结点。 树的高度不超过1000。

 

//=====================================================================

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

int dfs(struct TreeNode *root, int *up)
{
    //计算左子树的长度,如果没有左子树,则长度为0
    int l = root->left ? dfs(root->left, up): 0;
    
    //计算右子树的长度,如果没有右子树,则长度为0
    int r = root->right ? dfs(root->right, up):0;
    
    //如果左子树和根结点数值相同,则该结点为根的数长度加1,否则为0,因为不符合等值连续条件
    int resl = root->left && root->left->val==root->val ? l+1:0;
    
    //如果右子树和根结点数值相同,则该结点为根的数长度加1,否则为0,因为不符合等值连续条件
    int resr = root->right && root->right->val==root->val ? r+1:0;
    
    //该结点为根的总长度与保存的最大值比较,如果超过最大长度,则更新最大长度
    if(resl+resr > *up)
    {
        *up = resl+resr;
    }
    
    //返回以该结点为根符合条件的长度
    return (resl>resr?resl:resr);
}
int longestUnivaluePath(struct TreeNode* root) {
    if(root==NULL)
    {
        return 0;
    }
    
    int up=0;
    
    //求等值的最大长度
    dfs(root, &up);
    
    return up;
}

 

你可能感兴趣的:([leetcode-递归])