Leetcode 1028.從先序遍歷還原二叉樹(Recover a Tree From Preorder Traversal)

Leetcode 1028.從先序遍歷還原二叉樹

1 題目描述(Leetcode題目鏈接

  我們從二叉樹的根節點 root 開始進行深度優先搜索。

在遍歷中的每個節點處,我們輸出 D 條短劃線(其中 D 是該節點的深度),然後輸出該節點的值。(如果節點的深度爲 D,則其直接子節點的深度爲 D + 1。根節點的深度爲 0)。

如果節點只有一個子節點,那麼保證該子節點爲左子節點。

給出遍歷輸出 S,還原樹並返回其根節點 root。
在這裏插入圖片描述

輸入:"1-2--3--4-5--6--7"
輸出:[1,2,5,3,4,6,7]

提示:

  • 原始樹中的節點數介於 1 和 1000 之間。
  • 每個節點的值介於 1 和 10 ^ 9 之間。

2 題解

  用一個棧來存節點。

class Solution:
    def recoverFromPreorder(self, S: str) -> TreeNode:
        stack = []
        i = 0

        while i < len(S):
            num = 0
            val = ""
            while S[i] == "-":
                num += 1
                i += 1
            while i < len(S) and S[i] != "-":
                val += S[i]
                i += 1
            node = TreeNode(int(val))
            if not stack: 
                stack.append(node)
                continue
            if num == len(stack):
                stack[-1].left = node
            else:
                while num != len(stack):
                    stack.pop()
                stack[-1].right = node
            stack.append(node)
     
        return stack[0]

記錄一個用正則表達式做的方法,思路應該是一樣的。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def recoverFromPreorder(self, S: str) -> TreeNode:
        i = S.find('-')
        if i == -1:
            return TreeNode(int(S)) if S else None
        stack = [TreeNode(int(S[:i]))]
        for d, num in re.findall(r'(\-+)(\d+)', S):
            del stack[len(d):]
            node = TreeNode(int(num))
            if not stack[-1].left:
                stack[-1].left = node
            else:
                stack[-1].right = node
            stack.append(node)
        return stack[0]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章