LeetCode 687.最长同值路径 | 刷题打卡

186 阅读2分钟

题目描述

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

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

示例 1:

输入:

              5
             / \
            4   5
           / \   \
          1   1   5

输出:

2

示例 2:

输入:

              1
             / \
            4   5
           / \   \
          4   4   5

输出:

2

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


思路

这是一道经典的树递归问题,使用后序遍历的dfs,按照如下规则进行递归:

  1. 设置返回以root为根节点的树的最长同值路径的长度。
  2. 递归,以每一个节点为根节点进行步骤1 ,并取其中的最大长度。 需注意的是,在1. 操作中,根节点是特殊的;具体的说:若同值路径存在,只有根节点的左儿子 和右儿子可以被同时接入路径;且根节点的父节点不能被接入路径。对于路径中其他节点,最多只有一个子节点被接入路径。

C++代码(详细注释)

class Solution {
public:
    int ans = 0;
    int longestUnivaluePath(TreeNode* root) {
        arrowLength(root);
        return ans;
    }
    int arrowLength(TreeNode* root){//arrowLength返回以root为根节点的单侧最大同值路径的长度
        if(!root) return 0;//
        int left = arrowLength(root->left);//left存储以root的左孩子为根节点的最大同值路径的长度
        int right = arrowLength(root->right);//存储以root的右孩子为根节点的最大同值路径的长度
        int arrowLeft = 0, arrowRight = 0;
        if(root->left && root->left->val == root->val){//若root的左孩子不为空且左孩子值与root值相等
            arrowLeft += left + 1;
        }
        if(root->right && root->right->val == root->val){//若root的右孩子不为空且右孩子值与root值相等
            arrowRight += right + 1;
        }
        ans = max(ans, arrowLeft + arrowRight);//ans存放步骤(2)的结果
        return max(arrowLeft, arrowRight);//保证路径不分叉且取到最大
    }

本文正在参与「掘金 3 月闯关活动」,点击查看活动详情