棧_Hard_1028_從先序遍歷還原二叉樹

文章目錄

題目描述

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

思路

  • 雖說標籤是hard類型的,但是題目不難
  • 具體思路如下:
  • 節點樹爲 1~1000,可以判定首節點一定存在
  • 首先提取出root節點,和深度一起拼成tuple,放到一個棧中 (數組也行)
  • 然後遍歷剩餘節點,統計其深度 和 數值 (深度用-表示)
  • 然後 遍歷到的剩餘節點的深度 和 棧中最後一個節點的深度 只有 大於、等於 和 小於 3 種情況。
  • 如果是大於,只可能深度比前者大1
  • 如果是小於,那可能小任意值,這裏用循環pop出棧中深度不等的node
  • 代碼如下:
# 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:
        import collections
        queue = collections.deque()
        index = 0
        while index < len(S) and S[index] != '-':
            index += 1
        Head = TreeNode(int(S[:index]))
        queue.append((Head, 0))  # node, node's deepth
        num, cnt, key = 0, 0, True  # 節點值, 節點值前的橫線數
        for i in range(index, len(S)):
            if S[i] == '-':
                cnt += 1
            else:
                num = num*10 + int(S[i])
                if i+1 == len(S) or (i+1 < len(S) and S[i+1] == '-'):
                    node = TreeNode(num)
                    while cnt < queue[-1][1]:  # 深度小於上一個節點的深度
                        queue.pop()
                    if cnt == queue[-1][1] + 1:  # 比上個節點深1層
                        if not queue[-1][0].left:  # left 爲空
                            queue[-1][0].left = node
                        else:
                            queue[-1][0].right = node
                    elif cnt == queue[-1][1]:  # 和上一個節點深度相同
                        queue.pop()
                        queue[-1][0].right = node
                    queue.append((node, cnt))
                    num, cnt = 0, 0

        return Head

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章