返回

从乐观点看:解码 LeetCode 331 - 验证二叉树的前序序列化

闲谈

前奏:二叉树的魅力

二叉树,作为数据结构领域的常青树,以其优雅的结构和广泛的应用场景俘获了无数程序员的心。从计算机图形学到人工智能,从文件系统到网络路由,二叉树的身影无处不在。理解二叉树,就如同理解了计算机世界的灵魂。

第一乐章:理解题目

LeetCode 331 的题目,看似复杂,实则蕴含着二叉树前序序列化的奥秘。前序序列化,顾名思义,就是按照根节点、左子树、右子树的顺序,将二叉树的结构用字符串表示出来。题目要求我们,给定一个字符串,判断它是否是一个合法的二叉树前序序列化。

第二乐章:算法解析

如何判断一个字符串是否是一个合法的二叉树前序序列化呢?这里有一个简单而巧妙的算法:

  1. 初始化一个栈,并将空节点标记符 # 压入栈中。
  2. 遍历字符串中的每一个字符:
    • 如果字符不是 #,则将其作为节点值压入栈中。
    • 如果字符是 #,则弹出栈顶的元素,并检查栈顶元素是否为 #。如果不是 #,则表示当前节点没有右子树;如果是 #,则表示当前节点既没有左子树也没有右子树。
  3. 重复步骤 2,直到遍历完整个字符串。
  4. 如果栈中只剩下一个元素,并且该元素为 #,则字符串是一个合法的二叉树前序序列化。否则,字符串不是一个合法的二叉树前序序列化。

第三乐章:代码实现

def is_valid_serialization(preorder):
  """
  判断给定的字符串是否是一个合法的二叉树前序序列化。

  Args:
    preorder: 一个字符串,表示二叉树的前序序列化。

  Returns:
    一个布尔值,表示字符串是否是一个合法的二叉树前序序列化。
  """

  stack = ['#']
  for val in preorder.split(','):
    while val == '#' and stack[-1] == '#':
      stack.pop()
      stack.pop()
    stack.append(val)

  return len(stack) == 1 and stack[0] == '#'


if __name__ == "__main__":
  print(is_valid_serialization("9,3,4,#,#,1,#,#,2,#,6,#,#"))  # True
  print(is_valid_serialization("1,#"))  # False
  print(is_valid_serialization("9,#,#,1"))  # False

尾声:回顾与展望

LeetCode 331 验证二叉树的前序序列化,看似复杂,实则蕴含着二叉树前序序列化的奥秘。通过深入理解算法的原理和实现,我们不仅掌握了解题技巧,更对二叉树的数据结构有了更深入的认识。

在未来的编程之旅中,二叉树还将不断出现在我们的视野中。我们将在不同的场景中,运用不同的算法,去解决各种各样的问题。每一次的挑战,都是一次成长的机会,每一次的成功,都是一段美好的回忆。