📜  用括号表示从字符串构造二叉树 |设置 2(1)

📅  最后修改于: 2023-12-03 14:56:23.713000             🧑  作者: Mango

用括号表示从字符串构造二叉树 |设置 2

在计算机科学中,二叉树是一种重要的数据结构。二叉树由节点组成,每个节点最多只有两个子节点。一个节点有左子节点和右子节点,我们常常可以使用括号表示法来表示一个二叉树。

在这里,我们会介绍如何使用括号表示法来构造一个二叉树。具体来说,我们可以根据一组括号字符串来构造一个二叉树。

什么是括号表示法?

括号表示法是一种用于表示二叉树的字符串表示法。具体来说,一个二叉树可以用一组括号字符串来表示:

  • 如果一个节点没有子节点,那么它的括号表示法为 ()。
  • 如果一个节点只有左子节点,那么它的括号表示法为 (leftSubtree)。
  • 如果一个节点只有右子节点,那么它的括号表示法为 (rightSubtree)。
  • 如果一个节点同时有左右子节点,那么它的括号表示法为 (leftSubtree)(rightSubtree)。

例如,下图所示的二叉树可以表示为字符串 (3(1()(2))(4)):

   3
  / \
 1   4
  \
   2
如何使用括号表示法构造二叉树?

有了括号表示法,我们可以根据一组括号字符串构造一个二叉树。

具体来说,我们可以定义递归函数来构造二叉树。对于一棵以字符串 str 表示的二叉树,我们可以按照以下步骤构造它:

  1. 如果 str 为空字符串,那么返回 None,表示这是一棵空树。
  2. 如果 str 不为空字符串,那么取出第一个字符,它表示二叉树的根节点的值。
  3. 然后,我们需要找到左右子树的开始和结束位置。左子树的开始位置是根节点的后一个位置。左子树和右子树的结束位置可以通过在符号栈中进行匹配来得到。
  4. 递归构造左子树和右子树。
  5. 最后,将根节点和左右子树连接起来,返回这棵二叉树。

下面是一个 Python 代码片段,用于根据括号表示法构造二叉树:

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


def buildTree(s: str) -> TreeNode:
    if not s:
        return None

    # 取出根节点的值
    val, i = 0, 0
    if s[0] == '-':
        i = 1
    while i < len(s) and s[i].isdigit():
        val = val * 10 + ord(s[i]) - ord('0')
        i += 1
    if i < len(s) and s[i] == '-':
        val = -val
        i += 1

    # 查找左右子树的边界
    count, j = 0, i
    while j < len(s):
        if s[j] == '(':
            count += 1
        elif s[j] == ')':
            count -= 1
        if count == 0:
            break
        j += 1

    # 递归构造左右子树
    left = buildTree(s[i+1:j])
    right = buildTree(s[j+2:len(s)-1])

    # 返回二叉树
    return TreeNode(val, left, right)

这个代码片段实现了一个函数 buildTree(s: str) -> TreeNode,其中 s 表示括号表示法字符串,返回二叉树的根节点。

总结

这篇文章介绍了如何使用括号表示法构造二叉树。我们可以通过定义递归函数来实现这个过程,具体步骤如下:

  1. 如果字符串为空,返回 None。
  2. 在字符串中取出根节点的值和左右子树的边界,递归构造左右子树。
  3. 将根节点和左右子树连接起来,返回根节点。

实际上,括号表示法在算法竞赛和面试中是一个常见的问题,学好括号表示法可以提高算法竞赛和面试的水平。