📜  二叉树中最长的连续序列(1)

📅  最后修改于: 2023-12-03 15:21:39.955000             🧑  作者: Mango

二叉树中最长的连续序列

简介

二叉树中最长的连续序列是指二叉树中节点值连续的最长路径。比如下面这个二叉树,

   1
    \
     3
    / \
   2   4
        \
         5

最长的连续序列是 3-4-5,长度为 3。

该问题的解法一般需要用到二叉树的遍历,可以采用深度优先搜索(DFS)或广度优先搜索(BFS)。

解法
DFS

我们可以采用 DFS 的方法,从根节点开始遍历整个二叉树,每当遍历到一个节点时,需要记录以下信息:

  1. 当前节点的值
  2. 从根节点到当前节点的路径长度

根据题目要求,当前节点的值必须与其父节点的值连续。为了达到这个目的,我们需要比较当前节点的值和父节点的值,判断它们是否连续。如果连续,我们可以将连续路径长度加 1,否则将连续路径长度重置为 1。

同时,我们需要记录下当前的最长连续路径长度,每当更新连续路径长度时,就可以通过比较最长连续路径和新的连续路径长度,更新最长连续路径长度。

下面是采用 DFS 解决该问题的 Python 代码实现(假设二叉树的节点类为 TreeNode,包含属性 valleftright):

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

我们也可以采用 BFS 的方法来解决该问题。和 DFS 的方法类似,我们需要记录每个节点的值和从根节点到该节点的路径长度,并依次遍历压入队列中。

采用 BFS 的优点是能够有效减少空间复杂度,因为此时只需要存储当前层的节点信息,而不需要记录整个二叉树的遍历路径。

下面是采用 BFS 解决该问题的 Python 代码实现(同样假设二叉树的节点类为 TreeNode,包含属性 valleftright):

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 都可以解决该问题,具体方法在实现上略有不同。