687. 最长同值路径 ●●

本文详细介绍了如何解决二叉树中最长同值路径的问题,通过深度优先搜索(DFS)策略,以每个节点为起点计算最长路径。文章提供了代码实现,并强调了关键点,如路径的定义、全局变量的初始化以及处理边界条件。此外,还讨论了时间复杂度和空间复杂度。
摘要由CSDN通过智能技术生成

687. 最长同值路径 ●●

描述

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

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

示例

在这里插入图片描述
输入:root = [1,4,5,4,4,5]
输出:2

题解

一篇文章解决所有二叉树路径问题(问题分析+分类模板+题目剖析)

DFS (非自顶而下)

这类题目一般解题思路如下:
设计一个辅助函数 maxpath,调用自身求出以一个节点为根节点的左侧最长路径 left 和右侧最长路径 right,那么经过该节点的最长路径就是left + right;接着只需要从根节点开始 dfs,不断比较更新全局变量即可。

int res = 0;
int maxPath(TreeNode *root) //以root为路径起始点的最长路径
{
    if (!root)
        return 0;
    int left = maxPath(root->left);
    int right = maxPath(root->right);
    res = max(res, left + right + root->val); //更新全局变量  
    return max(left, right);   //返回左右路径较长者
}

这类题型 DFS 注意点:

1、left,right 代表的含义要根据题目所求设置,比如最长路径、最大路径和等等
2、全局变量 res 的初值设置是 0 还是 INT_MIN 要看题目节点是否存在负值,如果存在就用INT_MIN,否则就是0
3、注意两点之间路径为1,因此一个点是不能构成路径的

  • 时间复杂度:O(N),其中 N 是树中节点数。我们处理每个节点一次。
  • 空间复杂度:O(H),其中 H 是树的高度。我们的递归调用栈可以达到 H 层的深度。

本题代码如下:

class Solution {
public:
    int ans;

    int longestUnivaluePath(TreeNode* root) {
        ans = 0;
        longestPath(root);
        return ans;
    }

    int longestPath(TreeNode* node){
        if(node == nullptr) return 0;
        int left = longestPath(node->left);     // 以左孩子为根节点的单边最长长度
        int right = longestPath(node->right);   // 以右孩子为根节点的单边最长长度
        if(node->left != nullptr && node->val == node->left->val){
            ++left;                     // 经过左孩子的单边长度 + 1
        }else{
            left = 0;                   // 不相等则为0 【这里很重要,表示没有路径】
        }
        if(node->right != nullptr && node->val == node->right->val){
            ++right;
        }else{
            right = 0;                  
        }
        ans = max(ans, left + right);   // 更新全局变量,left + right 表示当前节点作为路径根节点
        return max(left, right);        // 返回单边最长长度,当前节点可能不是根节点
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值