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

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

用括号表示从字符串构造二叉树

在树的数据结构中,二叉树是一种最为基本的结构,而从字符串构造二叉树是一道常见的考察二叉树基本知识点的面试题。在面试中,考察从字符串构造二叉树的主要目的是考察程序员以下技能:

  • 理解二叉树基本结构
  • 理解递归的实现方式
  • 对树的遍历(前序、中序、后序遍历)的掌握程度
  • 对栈和队列的应用掌握程度

下面我们来介绍一下从字符串构造二叉树的基本方法及实现方式。

基本原理

在将字符串转化为二叉树时,需要使用括号表示法(也称为前缀表示法)来表示树的结构。括号表示法指定了每个节点的父节点以及节点在树中的相对位置。具体地说,括号表示法使用括号和逗号构成一个字符串,其中括号由左右括号(左括号表示子树的开头,右括号表示子树的结束)和逗号分隔符组成,如 (1,(2),(3,(4),(5)))。其中表示的树如下图所示:

       1
     /   \
    2     3
         / \
        4   5

括号表示法的基本语法是:

  • (val):表示只包含一个节点,该节点的值为 val
  • ():表示空节点,即叶子节点。
  • (val, left_subtree, right_subtree):表示包含一个节点和它的左右子树,其中 left_subtreeright_subtree 也可以为空。

基于括号表示法,我们可以通过递归的方式将字符串构造为一棵二叉树。大致过程如下:

  1. 检查字符串是否为空,或者只包含空格。如果是,返回 None
  2. 从字符串开头找出第一个以括号开头的子串。
  3. 根据第一个括号,确定当前节点的值,如果当前节点的值为空,返回 None
  4. 递归构建左子树和右子树,分别找到左右子树的括号表示,并构造两棵子树。
  5. 将构造好 的左右子树分别设为当前节点的左右子节点,返回当前节点。
代码实现

我们可以通过实现一个递归函数来将字符串构造为一棵二叉树。下面是一个 Python 实现的例子:

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
        
class Solution:
    def str2tree(self, s: str) -> TreeNode:
        if not s:
            return None
        
        # 找到第一个左括号,并确定当前节点的值
        i, val = 0, ''
        while i < len(s) and s[i] not in {',', ')'}:
            val += s[i]
            i += 1
        node = TreeNode(int(val))
        
        # 递归构建左子树和右子树
        if i < len(s) and s[i] == '(':
            start = i + 1
            count = 1
            while i < len(s) - 1 and count != 0:
                i += 1
                if s[i] == '(':
                    count += 1
                elif s[i] == ')':
                    count -= 1
            
            # 构建左子树
            node.left = self.str2tree(s[start:i])
            
            if i < len(s) - 1:
                # 构建右子树
                node.right = self.str2tree(s[i+2:len(s)-1])
        
        return node

实现中,我们定义了一个 TreeNode 类来表示树的节点,然后用一个 Solution 类封装了一个名为 str2tree 的函数来实现将字符串构造为二叉树。具体实现详情见代码。