LeetCode 最长同值路径(图解)

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

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

示例 1:

输入:
              5
             / \
            4   5
           / \   \
          1   1   5
输出:
2

示例 2:

输入:
              1
             / \
            4   5
           / \   \
          4   4   5
输出:
2

注意: 给定的二叉树不超过10000个结点。 树的高度不超过1000。
思路分析: 以root为路径起始点的最长路径只有两种情况,
第一种是root和root-left,如图中以4为路径起始点->root->left
LeetCode 最长同值路径(图解)_第1张图片
第二种是root和root-right,如图中以4为路径起始点->root->right
LeetCode 最长同值路径(图解)_第2张图片
蛋式还有一种特殊情况,就是root是路径的中间节点。
LeetCode 最长同值路径(图解)_第3张图片
不过还有一点需要的说明的是,下图这种情况最大只能算作2,因为路径只有一个起始一个末端。
LeetCode 最长同值路径(图解)_第4张图片

/**
 * 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 maxRes = 0;//最长的路径
    int longestUnivaluePath(TreeNode* root) {
        myFunc(root);
        return maxRes;
    }
    //返回以root为路径起始点最长路径长
    int myFunc(TreeNode* root){
        if (root == NULL){
            return 0;
        }
        int tempRes = 0;
        int leftMaxVal = myFunc(root->left);//递归左子树
        int rightMaxVal = myFunc(root->right);//递归右子树
        //特殊情况,当root是最长路径的中间节点
        if (root->left != NULL && root->right != NULL && root->left->val == root->right->val && root->left->val == root->val){
            //这种情况只对于寻找最长路径长有帮助,对于搜索以root为路径起始点的最长路径没有帮助
            maxRes = max(maxRes, leftMaxVal + rightMaxVal + 2);
        }
        //从左右子树中选择最长的路径
        if (root->left != NULL && root->left->val == root->val){
            tempRes = leftMaxVal + 1;
        }
        if (root->right != NULL && root->right->val == root->val){
            tempRes = max(tempRes, rightMaxVal + 1);
        }
        maxRes = max(maxRes, tempRes);
        return tempRes;
    }
};

LeetCode 最长同值路径(图解)_第5张图片

你可能感兴趣的:(LeetCode,二叉树,递归)