leetcode
leetcode 501 ~ 550
二叉树最长连续序列 II

二叉树最长连续序列 II

难度:

标签:

题目描述

代码结果

运行时间: 35 ms, 内存: 17.4 MB


/*
 题目思路:
 1. 在Java Stream中处理二叉树的递归问题并不直观,因此主要的逻辑还是要依赖于递归函数。
 2. 我们可以使用Stream来简化部分代码的编写,但是整体结构与普通Java解决方案差异不大。
*/
 
public class Solution {
    private int maxLength = 0;
    
    public int longestConsecutive(TreeNode root) {
        longestPath(root);
        return maxLength;
    }
    
    private int[] longestPath(TreeNode root) {
        if (root == null) return new int[]{0, 0};
        
        int incr = 1, decr = 1;
        
        if (root.left != null) {
            int[] left = longestPath(root.left);
            if (root.val == root.left.val + 1) {
                decr = left[1] + 1;
            } else if (root.val == root.left.val - 1) {
                incr = left[0] + 1;
            }
        }
        
        if (root.right != null) {
            int[] right = longestPath(root.right);
            if (root.val == root.right.val + 1) {
                decr = Math.max(decr, right[1] + 1);
            } else if (root.val == root.right.val - 1) {
                incr = Math.max(incr, right[0] + 1);
            }
        }
        
        maxLength = Math.max(maxLength, incr + decr - 1);
        return new int[]{incr, decr};
    }
}
 

解释

方法:

这个题解使用递归的深度优先搜索(DFS)来遍历二叉树。对于每个节点,分别递归遍历其左右子树,返回两个值:从该节点开始向下递增序列的长度和向下递减序列的长度。在遍历过程中,根据当前节点与其左右子节点的值的关系,更新向下递增序列和向下递减序列的长度,并记录最长连续序列的长度。最终返回整棵树中最长连续序列的长度。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
在递归函数中,如果当前节点的左右子节点都不存在,返回的递增和递减序列长度为何都是1?
当一个节点没有左右子节点时,该节点本身可以视为一个长度为1的连续序列。因此,无论是从该节点开始的递增序列还是递减序列,长度都是1,因为没有其他节点可以与之形成更长的连续序列。
🦆
递归遍历过程中,如果左子节点或右子节点的值与当前节点值的差不是1,递增或递减序列长度是如何处理的?
如果当前节点的子节点值与当前节点的值差不是1,那么这个子节点不会与当前节点形成连续的递增或递减序列。在这种情况下,当前节点的递增或递减序列长度不会被子节点的相应序列值影响,它们保持为1,即仅包括当前节点自身。
🦆
当左子树和右子树的序列长度都被计算后,为什么选择使用`max`函数比较并更新递增和递减序列的长度?
使用`max`函数是为了确定从当前节点开始向下的最长递增或递减序列。由于左子树和右子树可能分别形成不同长度的连续序列,因此我们需要选择左右子树中更长的一个序列来与当前节点形成更长的连续序列。
🦆
在计算最长连续序列长度时,为什么要将`incr`和`decr`的值相加后再减一?
当计算包括当前节点在内的最长连续序列时,`incr`代表向下递增序列的长度,`decr`代表向下递减序列的长度。由于这两个序列都包含当前节点,因此在将它们相加时会重复计算当前节点。为了得到正确的序列总长度,需要从总和中减去1,以去除这种重复计数。

相关问题

二叉树最长连续序列

二叉树最长连续序列