分析
题目说这个是树的前序遍历。
不仅仅是输出数字,还要输出括号。有4种情况:
- 左右子树都为空。输出
root - 左子树不空,右子树空。输出
root(left) - 左子树不空,右子树空。左子树的部分用空括号代替。输出
root()(right). - 左右子树都不为空。输出
root(left)(right)
方法一 栈
- 入栈的时候,
(和val同时加到结果列表 - 在访问右子树时,判断当前节点的左子树是否为空,决定加不加
() - 当前节点的左右子树都访问完后,从栈中弹出,此时加右括号
) - 最后去掉最外层的括号
class Solution:
def tree2str(self, t: TreeNode) -> str:
root = t
if not root:
return ''
stack = []
r = []
last_visit = root
while root or stack:
while root:
# print(root.val)# 先序遍历
r.append('(')
r.append(root.val)
stack.append(root)
root = root.left
root = stack[-1]
if root.right != last_visit:
# print(root.val) # 中序遍历
if root.left == None and root.right != None:
r.append('()')
root = root.right
if root == None:
last_visit = None
else:
temp = stack.pop()
r.append(')')
# print(temp.val)# 后序遍历
last_visit = temp
root = None
return ''.join(map(str, r))[1:-1]
方法二 递归
根据上述的四种情况,进行递归。
class Solution:
def tree2str(self, t: TreeNode) -> str:
root = t
if not root:
return ''
if not (root.left or root.right):
return str(root.val)
if (not root.left) and root.right:
return str(root.val) + '()' + '(' + self.tree2str(root.right) + ')'
if root.left and (not root.right):
return str(root.val) + '(' + self.tree2str(root.left) + ')'
return str(root.val) + '(' + self.tree2str(root.left) + ')' + '(' + self.tree2str(root.right) + ')'
该博客介绍了如何将一棵平衡二叉树转化为字符串表示,主要涉及前序遍历。提供了两种方法,一种使用栈实现,另一种采用递归策略。在不同情况下,针对左右子树为空或不空的情况,分别处理括号的添加,以正确表示树的结构。


257

被折叠的 条评论
为什么被折叠?



