返回

高效理解LeetCode 606:二叉树转字符串,剖析前序遍历的奥秘

闲谈

LeetCode 606:二叉树转字符串

问题
给定一棵二叉树,设计一个算法,将这棵二叉树转换成一个由括号和整数组成的字符串。

  • 空节点则用一对空括号 "()" 表示。
  • 而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

示例:
给定二叉树:

     1
    / \
   2   3
    \
     4

返回字符串 "1(2(4))(3)"。

理解问题

LeetCode 606的问题核心在于将二叉树的结构编码成一个由括号和整数组成的字符串,以便于传输、存储和解析。

算法思路

1. 前序遍历

算法的关键在于使用前序遍历的方式遍历二叉树,同时将遍历结果记录在一个字符串中。前序遍历是指:

  1. 访问当前结点。
  2. 递归地遍历左子树。
  3. 递归地遍历右子树。

2. 字符串编码

在遍历过程中,将每个结点的值和括号添加到字符串中。如果当前结点为空,则添加一对空括号 "()"。

3. 字符串解码

解码过程与编码过程相反,通过字符串重建二叉树。

  1. 从字符串中读取第一个字符。
  2. 如果是数字,则将该数字作为根结点。
  3. 如果是左括号 "(", 则递归地读取字符串,构建左子树。
  4. 如果是右括号 ")", 则递归地读取字符串,构建右子树。

代码实现

def tree2str(root):
    if not root:
        return ""

    # 前序遍历二叉树
    def preorder(node):
        if not node:
            return "()"

        # 将结点值和括号添加到字符串中
        result = str(node.val)

        # 递归地遍历左子树和右子树
        if node.left:
            result += "(" + preorder(node.left) + ")"
        if node.right:
            if node.left:
                result += "(" + preorder(node.right) + ")"
            else:
                result += "()" + preorder(node.right)

        return result

    return preorder(root)

运行结果

使用给定的二叉树作为输入,算法返回字符串 "1(2(4))(3)",这与示例中的输出一致。

总结

LeetCode 606是一个经典的算法问题,它考察了对二叉树的前序遍历和字符串编码/解码的理解。通过本文的详细讲解和代码示例,您应该已经掌握了这一算法的原理和实现方法。