📅  最后修改于: 2023-12-03 15:21:39.955000             🧑  作者: Mango
二叉树中最长的连续序列是指二叉树中节点值连续的最长路径。比如下面这个二叉树,
1
\
3
/ \
2 4
\
5
最长的连续序列是 3-4-5,长度为 3。
该问题的解法一般需要用到二叉树的遍历,可以采用深度优先搜索(DFS)或广度优先搜索(BFS)。
我们可以采用 DFS 的方法,从根节点开始遍历整个二叉树,每当遍历到一个节点时,需要记录以下信息:
根据题目要求,当前节点的值必须与其父节点的值连续。为了达到这个目的,我们需要比较当前节点的值和父节点的值,判断它们是否连续。如果连续,我们可以将连续路径长度加 1,否则将连续路径长度重置为 1。
同时,我们需要记录下当前的最长连续路径长度,每当更新连续路径长度时,就可以通过比较最长连续路径和新的连续路径长度,更新最长连续路径长度。
下面是采用 DFS 解决该问题的 Python 代码实现(假设二叉树的节点类为 TreeNode
,包含属性 val
、left
和 right
):
class Solution:
def longestConsecutive(self, root: TreeNode) -> int:
if not root:
return 0
self.max_length = 1 # 记录最长连续路径长度
def dfs(node: TreeNode, parent_val: int, length: int):
if not node:
return
# 判断当前节点值是否连续
if node.val == parent_val + 1:
length += 1
else:
length = 1
# 更新最长连续路径长度
self.max_length = max(self.max_length, length)
dfs(node.left, node.val, length)
dfs(node.right, node.val, length)
dfs(root, root.val, 1)
return self.max_length
我们也可以采用 BFS 的方法来解决该问题。和 DFS 的方法类似,我们需要记录每个节点的值和从根节点到该节点的路径长度,并依次遍历压入队列中。
采用 BFS 的优点是能够有效减少空间复杂度,因为此时只需要存储当前层的节点信息,而不需要记录整个二叉树的遍历路径。
下面是采用 BFS 解决该问题的 Python 代码实现(同样假设二叉树的节点类为 TreeNode
,包含属性 val
、left
和 right
):
from collections import deque
class Solution:
def longestConsecutive(self, root: TreeNode) -> int:
if not root:
return 0
queue = deque([(root, root.val, 1)]) # 初始化队列
max_length = 1 # 记录最长连续路径长度
while queue:
node, parent_val, length = queue.popleft()
# 判断当前节点值是否连续
if node.val == parent_val + 1:
length += 1
else:
length = 1
# 更新最长连续路径长度
max_length = max(max_length, length)
if node.left:
queue.append((node.left, node.val, length))
if node.right:
queue.append((node.right, node.val, length))
return max_length
二叉树中最长的连续序列是一个有趣而又实用的问题,在二叉树的遍历过程中需要做一些额外的记录与判断。采用 DFS 或 BFS 都可以解决该问题,具体方法在实现上略有不同。