📅  最后修改于: 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_subtree
和 right_subtree
也可以为空。基于括号表示法,我们可以通过递归的方式将字符串构造为一棵二叉树。大致过程如下:
None
。None
。我们可以通过实现一个递归函数来将字符串构造为一棵二叉树。下面是一个 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
的函数来实现将字符串构造为二叉树。具体实现详情见代码。