leetcode
leetcode 251 ~ 300
二叉树最长连续序列

二叉树最长连续序列

难度:

标签:

题目描述

代码结果

运行时间: 43 ms, 内存: 20.0 MB


/*
 * 思路:
 * 1. 使用深度优先搜索(DFS)和Java Stream的思想来遍历二叉树。
 * 2. 我们需要追踪当前节点值与其父节点值的连续性。
 * 3. 如果当前节点值与父节点值是连续的,则计数加一;否则,计数重置为1。
 * 4. 在遍历过程中更新最长连续序列的长度。
 */
 
import java.util.stream.Stream;
import java.util.stream.Collectors;
import java.util.List;
import java.util.ArrayList;
 
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}
 
public class Solution {
    private int maxLength = 0;
 
    public int longestConsecutive(TreeNode root) {
        if (root == null) return 0;
        dfs(root, null, 0);
        return maxLength;
    }
 
    private void dfs(TreeNode node, TreeNode parent, int length) {
        if (node == null) return;
        if (parent != null && node.val == parent.val + 1) {
            length++;
        } else {
            length = 1;
        }
        maxLength = Math.max(maxLength, length);
        Stream.of(node.left, node.right).filter(child -> child != null).forEach(child -> dfs(child, node, length));
    }
}

解释

方法:

这道题使用递归的方式对二叉树进行深度优先搜索。从根节点开始,递归遍历左右子树,同时记录当前连续序列的长度。如果当前节点的值比前一个节点的值大1,则将连续序列长度加1,并更新最长连续序列长度;否则,重置连续序列长度为1。递归结束后,返回最长连续序列的长度。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
在算法中,递归遍历时传递的`pre_node`参数的作用是什么?是用于比较当前节点和前一个节点的值吗?
是的,`pre_node`参数在算法中起到关键作用,主要用于记录当前节点的前一个节点。这样,每次递归调用时,可以通过比较当前节点的值和前一个节点的值来确定是否当前节点继续形成连续递增序列。如果当前节点的值正好比前一个节点的值大1,则连续序列长度增加;否则,连续序列长度重置为1。这是实现二叉树最长连续序列问题的核心逻辑。
🦆
如果二叉树中存在重复的值会怎样影响算法?例如,当两个连续节点具有相同的值时,这种情况下连续序列的长度应该如何处理?
在当前的算法实现中,如果二叉树中的连续节点具有相同的值,这些节点不会被计算为连续递增的一部分。算法只考虑值严格递增的情形,即当前节点的值必须比前一个节点的值大1。因此,如果两个连续的节点值相同,连续序列的长度会被重置为1。这意味着重复值打断了连续递增序列的计算。
🦆
该算法是否考虑了二叉树节点值的整体顺序,或者仅仅是局部的父子关系顺序?例如,如果一个子树的根节点比其父节点小,但其子节点值连续增大,这种情况下算法如何处理?
该算法主要关注局部的父子关系顺序以确定值是否连续递增。它不需要考虑二叉树节点值的整体顺序。即使子树的根节点值比其父节点小,只要子树内部的节点值连续递增,这些节点仍然被计算为一部分连续序列。算法的设计确保了只要节点之间的值满足连续递增,就可以形成有效的连续序列,不受整体树结构的影响。
🦆
递归函数`tra`中,当当前节点的值不比前一个节点的值大1时,连续序列长度重置为1。这种设计是否意味着只计算从当前节点开始的新序列,而不是整个树中的任意位置开始的最长序列?
此设计确实意味着每次当节点的值没有形成递增序列时,算法会重置连续序列的长度为1,并从当前节点开始尝试形成新的连续序列。然而,通过全局变量`max_cnt`的使用,算法仍然能保持跟踪并更新整个树中观察到的最长连续序列长度。因此,尽管连续序列长度在局部被重置,算法仍然能够从整个二叉树中找到最长的连续递增序列。

相关问题

最长连续序列

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

 

示例 1:

输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。

示例 2:

输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9

 

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109

二叉树最长连续序列 II

二叉树最长连续序列 II