写点什么

【LeetCode】最长同值路径 Java 题解

作者:Albert
  • 2022-11-10
    北京
  • 本文字数:1136 字

    阅读完需:约 4 分钟

题目描述

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


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


示例 1:
输入:root = [5,4,5,1,1,5]输出:2
示例 2:
输入:root = [1,4,5,4,4,5]输出:2
来源:力扣(LeetCode)链接:https://leetcode.cn/problems/longest-univalue-path著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码

思路分析

  • 今天的算法题目是二叉树相关题目,题目要求我们计算出值相同的最长路径长度。分析题目,求最长路径长度,这里的路径可能是从根结点开始,也可能不从左右子树开始。而两个路径的长度是由他们的边决定的,所以最长同值路径长度必定为某一节点的左最长同值有向路径长度与右最长同值有向路径长度之和。

  • 解决树的遍历题目,我们最常用的方法是 BFS(广度优先搜索)和 DFS(深度优先搜索)。这里,我们采用 DFS,DFS 简单理解就是每次都尝试向更深的节点走。在树的遍历中,DFS 首先完成递归中止条件,当 node 的值是 null 的时候,返回 0。如何判断是否同值呢?我们只需要将当前左子树的值和当前根结点的值比较即可,如果相同,则长度+1,右子树处理同理。这里需要注意的是,我们需要将左子树同值有向路径长度与右子树同值有向路径长度相加,才是当前的最长有向路径长度。动态更新 ans 即可。

  • 具体实现代码如下,供参考。

通过代码

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode() {} *     TreeNode(int val) { this.val = val; } *     TreeNode(int val, TreeNode left, TreeNode right) { *         this.val = val; *         this.left = left; *         this.right = right; *     } * } */class Solution {    int ans = 0;
public int longestUnivaluePath(TreeNode root) { dfs(root); return ans; }
public int dfs(TreeNode root) { if (root == null) { return 0; } int leftLength = dfs(root.left); int rightLength = dfs(root.right); int left1 = 0, right1 = 0; if (root.left != null && root.left.val == root.val) { left1 = leftLength + 1; } if (root.right != null && root.right.val == root.val) { right1 = rightLength + 1; } ans = Math.max(ans, left1 + right1); return Math.max(left1, right1); }}
复制代码

总结

  • 上述算法的时间复杂度是 O(n),空间复杂度是 O(1)

  • 坚持算法每日一题,加油!


发布于: 刚刚阅读数: 2
用户头像

Albert

关注

数据结构和算法爱好者 2019-09-29 加入

LeetCode,略懂后端的RD

评论

发布
暂无评论
【LeetCode】最长同值路径Java题解_算法_Albert_InfoQ写作社区