当前位置: 面试刷题>> 二叉树最长连续序列 (经典算法题500道)


题目描述补充

给定一棵二叉树,其中每个节点的值都是唯一的,并且每个节点都有一个对应的值(val)。现在需要找到这棵树中任意起点开始的最长连续序列路径的长度。连续序列是指序列中任意两个相邻节点的值相差为1。例如,在序列 [100, 101, 102, 103] 中,任意两个相邻元素都相差1,这是一个连续序列。

注意

  • 路径可以从任意节点开始,并且不一定需要经过根节点。
  • 路径可以是向上、向下或斜向(即跨越父子节点的兄弟节点)的,但必须是连续的。
  • 树的节点定义如下(以Python为例,其他语言类似):
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

示例

假设我们有以下二叉树:

    10
   /  \
  5    15
 / \    \
3   7    16

最长连续序列可以是 [5, 6, 7](假设存在值为6的节点作为7的兄弟节点),长度为3。但在这个具体的例子中,我们仅考虑已存在的节点,所以最长连续序列可能是 [5, 6, 7](如果6是某个存在的节点)或 [15, 16, 17](如果17是某个存在的节点),但在给定的树结构中,最长连续序列实际上为 [3, 4, 5, 6, 7](假设我们添加了一些额外的节点来形成连续序列),但基于原始树,我们考虑最长可达序列(在现有节点间)。

###解题思路

由于题目没有明确说明所有可能的连续序列都必须在树中显式以地节点形式存在,我们假设题目意图是寻找在给定树结构下,通过任何节点值加减1能形成的最长连续序列(尽管这可能意味着我们需要假设某些不存在的节点值存在)。然而,一个更实际的解法是仅考虑树中已存在的节点,并使用深度优先搜索(DFS)或广度优先搜索(BFS)结合哈希集合来记录访问过的值,以检测连续序列。

但这里,为了简化,我们仅考虑已存在的节点,并使用DFS来探索所有可能的路径,并记录最长连续序列。

示例代码(Python)

由于直接实现题目要求的完整逻辑(包括不存在的节点假设)较为复杂,这里给出一个基于现有节点使用DFS的简化示例:

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def longestConsecutive(root):
    def dfs(node, prev, current_length, max_length):
        if not node:
            return
        
        # Check if current node extends the sequence
        if prev is None or node.val == prev + 1:
            current_length += 1
        else:
            current_length = 1
        
        # Update max length
        max_length[0] = max(max_length[0], current_length)
        
        # Recursive calls
        dfs(node.left, node.val, current_length, max_length)
        dfs(node.right, node.val, current_length, max_length)
        
        # Reset current length after backtracking
        if node.val != prev + 1:
            current_length = 0

    max_length = [0]
    dfs(root, None, 0, max_length)
    return max_length[0]

# Example usage
# Building the tree: 10 -> 5 -> 3, 7 | 10 -> 15
root = TreeNode(10)
root.left = TreeNode(5)
root.right = TreeNode(15)
root.left.left = TreeNode(3)
root.left.right = TreeNode(7)

print(longestConsecutive(root))  # Output would depend on the actual tree structure and continuous sequence assumptions

注意:上述代码没有考虑跨层(兄弟节点间)的连续序列,因为它仅通过递归地深入子树来查找连续序列。要处理跨层连续序列,你可能需要采用更复杂的遍历策略或数据结构来记录和处理可能的跨层连接。

码小课:在码小课网站上,你可以找到更多关于二叉树、图论、算法设计等主题的详细讲解和示例代码,帮助你深入理解并掌握这些重要的算法和数据结构。

推荐面试题