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

Posted Alex_996

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode Algorithm 606. 根据二叉树创建字符串相关的知识,希望对你有一定的参考价值。

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

Ideas

把我珍藏多年的二叉树前序遍历代码模板呈上来:

    def preorderTraversalLoop(node):
        if not node:
            return
        stack = [node]  # list 模拟 stack
        while stack:
            tmp = stack.pop()
            print(tmp.value, end=' ')
            if tmp.right:
                stack.append(tmp.right)
            if tmp.left:
                stack.append(tmp.left)

这是通过列表来模拟栈进行非递归前序遍历的代码,但是这道题跟前序遍历还有所不同,还需要输出额外的括号。

我们来分析一下,有以下4种情况:

  1. 当前节点有两个孩子,需要在两个孩子的结果外都加上一层括号
  2. 当前节点没有孩子,不需要在节点后面增加任何括号
  3. 当前节点只有左孩子没有右孩子,那么只需要给左孩子的结果外加上一层括号
  4. 当前节点只有右孩子没有左孩子,此时在输出右孩子之前需要先输出一对空括号,表示左孩子为空,右孩子的结果外加上一层括号

对于某一个节点的括号输出情况,我们需要在节点值输出之前打印一个"(",然后在这颗子树输出完之后再输出一个")"。

也就是说,我们在第一次到达某个节点时输出左括号和节点值,然后将节点压入栈中,遍历完了子树之后,再回到这个节点时,输出一个右括号。

为了所有节点统一处理,我们在根节点之前也要输出一个括号,保证统一,最后再把最外层的括号去掉就可以了。

Code

Python

class Solution:
    def tree2str(self, root: Optional[TreeNode]) -> str:
        if not root:
            return ''
        stack = [root]
        visit, ans = set(), ""
        while stack:
            item = stack[-1]
            if item in visit:
                stack.pop()
                ans += ')'
            else:
                visit.add(item)
                ans += f"(item.val"
                if item.left is None and item.right is not None:
                    ans += "()"
                if item.right:
                    stack.append(item.right)
                if item.left:
                    stack.append(item.left)
        return ans[1:-1]

以上是关于LeetCode Algorithm 606. 根据二叉树创建字符串的主要内容,如果未能解决你的问题,请参考以下文章

Python 解LeetCode:606 Construct String from Binary Tree

LeetCode Algorithm 543. 二叉树的直径

leetcode606

LeetCode Algorithm 129. 求根节点到叶节点数字之和

LeetCode Algorithm 129. 求根节点到叶节点数字之和

[leetcode-606-Construct String from Binary Tree]