1. 程式人生 > >LC 687. Longest Univalue Path

LC 687. Longest Univalue Path

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.

 

Runtime: 72 ms, faster than 28.47% of C++ online submissions for Longest Univalue Path.

對於這種不經過root的求和題往往都需要一個臨時變數,然後考慮一下根節點和子節點的關係,用一個引用得到最優解。

 

/**
 * 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 ret = 0, tmpret = 0; helper(root,tmpret, ret); return ret == 0 ? 0 : ret - 1; } int helper(TreeNode* root, int& tmpret, int& ret){ if(!root) return 0; int rl = helper(root->left, tmpret, ret); int rr = helper(root->right, tmpret, ret); if(!root->left && !root->right) { tmpret = 1; //ret = 1; return 1; } else if(!root->left && root->right){ if(root->val == root->right->val){ tmpret = max(tmpret, rr + 1); ret = max(ret, tmpret); return 1+rr; } else return 1; } else if(root->left && !root->right){ if(root->val == root->left->val){ tmpret = max(tmpret, 1+rl); ret = max(ret, tmpret); return 1+rl; } else return 1; } else { if(root->val == root->left->val && root->val == root->right->val){ tmpret = max(tmpret, 1+rr + rl); ret = max(ret, tmpret); return 1+max(rr,rl); } else if (root->val == root->left->val){ tmpret = max(tmpret, 1+rl); ret = max(ret, tmpret); return 1+rl; } else if (root->val == root->right->val){ tmpret = max(tmpret, 1+rr); ret = max(ret, tmpret); return 1+rr; } else return 1; } } };