606. 根据二叉树创建字符串

该博客介绍了如何将一棵平衡二叉树转化为字符串表示,主要涉及前序遍历。提供了两种方法,一种使用栈实现,另一种采用递归策略。在不同情况下,针对左右子树为空或不空的情况,分别处理括号的添加,以正确表示树的结构。

在这里插入图片描述
在这里插入图片描述
官方题解https://leetcode-cn.com/problems/balanced-binary-tree/solution/ping-heng-er-cha-shu-by-leetcode-solution/

分析

题目说这个是树的前序遍历。
不仅仅是输出数字,还要输出括号。有4种情况:

  1. 左右子树都为空。输出root
  2. 左子树不空,右子树空。输出root(left)
  3. 左子树不空,右子树空。左子树的部分用空括号代替。输出root()(right).
  4. 左右子树都不为空。输出root(left)(right)

方法一 栈

  1. 入栈的时候,(val同时加到结果列表
  2. 在访问右子树时,判断当前节点的左子树是否为空,决定加不加()
  3. 当前节点的左右子树都访问完后,从栈中弹出,此时加右括号)
  4. 最后去掉最外层的括号
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) + ')'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值