leetcode 687最长相同值路径

Given a binary tree, find the length of the longest path where each node in the path has the same value. This path may or may not pass through the root.

Note: The length of path between two nodes is represented by the number of edges between them.

Example 1:

Input:

              5
             / \
            4   5
           / \   \
          1   1   5

Output:

2

Example 2:

Input:

              1
             / \
            4   5
           / \   \
          4   4   5

Output:

2

Note: The given binary tree has not more than 10000 nodes. The height of the tree is not more than 1000.

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */


/**
 * 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 {
public:
    int longestUnivaluePath(TreeNode* root) {
        int maxpath=0;
        if(root==NULL)
        {
            return 0;
        }
        countpath(root,root,maxpath);
        return maxpath;
        
    }
    int countpath(TreeNode *root,TreeNode *root2,int& maxpath)
{
    if(root==NULL)
        return 0;
    int left=countpath(root->left,root,maxpath);
    int right=countpath(root->right,root,maxpath);
        left=(root->left&&root->left->val==root->val)?left+1:0;
        right=(root->right&&root->right->val==root->val)?right+1:0;
           maxpath=maxpath>(left+right)?maxpath:(left+right);
    return left>right?left:right;
}

};

思路:

对于这种树的路径问题,递归是不二之选。在递归函数中,我们首先对其左右子结点调用递归函数,得到其左右子树的最大相同值路径,下面就要来看当前结点和其左右子结点之间的关系了,如果其左子结点存在且和当前节点值相同,则left自增1,否则left重置0;同理,如果其右子结点存在且和当前节点值相同,则right自增1,否则right重置0。然后用left+right来更新结果res。而调用当前节点值的函数只能返回left和right中的较大值,因为如果还要跟父节点组path,就只能在左右子节点中选一条path,当然选值大的那个了

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页