1028. 从先序遍历还原二叉树

Hard

思路

看到还原二叉树的题目,想到之前有一题做的类似的。105. 从前序与中序遍历序列构造二叉树

105这道题是通过前序和中序确定一个二叉树。仔细思考一下我们就能发现,光有一个维度是确定不了二叉树的。

回到1028,光有前序肯定是不够的。发现还有-节点的深度

思考过程

以上,尝试写一下代码

过程中的问题

代码

python3

class Solution:
    def getNodeValue(self, s):
      for i in s.split('-'):
        if i != '':
          return i
          
    def split(self, s, l):
        left_found = False
        left_start = -1
        right_start = -1
        pre_number = False #避免出现多位数字的情况
        count = 0
        for i, v in enumerate(s):
            if v != '-':
                if count == l+1:
                  if left_found:
                    right_start = i
                    break
                  else:
                    left_start = i
                    left_found = not left_found
                if not pre_number:
                  count = 0
                else:
                  count += 1
            else:
                count += 1
                pre_Number = False
        offset = l + 1
        if right_start > 0:
            ls = s[left_start-offset:right_start-offset]
            rs = s[right_start-offset:]
        else:
            ls = s[left_start-offset:]
            rs = None
        # print(ls,rs)
        return ls, rs

    def buildNode(self, S, l):
        if len(S) == 0 or l > S.count('-'):
            return None
        node = TreeNode(self.getNodeValue(S))
        ls, rs = self.split(S, l)
        node.left = self.buildNode(ls, l+1)
        if rs:
            node.right = self.buildNode(rs, l+1)
        return node

    def recoverFromPreorder(self, S: str) -> TreeNode:
        node = self.buildNode(S, 0)
        return node

代码冗余很多,主要的原因是分割字符串的操作不聪明。找了一下大佬们的解法

暂时还没有尝试,感兴趣的小伙伴可以试一下