持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情
题目描述
给定一个二叉树的 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)
- 坚持算法每日一题,加油!