二叉树最长连续序列
难度:
标签:
题目描述
代码结果
运行时间: 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`参数的作用是什么?是用于比较当前节点和前一个节点的值吗?
▷🦆
如果二叉树中存在重复的值会怎样影响算法?例如,当两个连续节点具有相同的值时,这种情况下连续序列的长度应该如何处理?
▷🦆
该算法是否考虑了二叉树节点值的整体顺序,或者仅仅是局部的父子关系顺序?例如,如果一个子树的根节点比其父节点小,但其子节点值连续增大,这种情况下算法如何处理?
▷🦆
递归函数`tra`中,当当前节点的值不比前一个节点的值大1时,连续序列长度重置为1。这种设计是否意味着只计算从当前节点开始的新序列,而不是整个树中的任意位置开始的最长序列?
▷