↓快轉到主要內容
  1. LeetCode/

LeetCode 897: Increasing Order Search Tree

·1 分鐘· ·
LeetCode Easy Stack Tree Depth-First-Search Binary-Search-Tree
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2022-09-25

  • 提交紀錄:Accepted ×2 → Runtime Error ×3 → Wrong Answer ×4 → Accepted ×2

解題思路
#

中序遍歷會由小到大拿到節點(Tree 模板三)。用一個 dummy 和尾巴指標 tail:每拿到一個節點就接到 tail.right,把它的 left 設成 None,tail 往後移。最後回傳 dummy.right。

我的嘗試
#

前幾版對 None 取屬性。之後的錯都在 dummy:直接移動 dummy 當尾巴,最後回傳的 dummy.right 是最後一個節點的右邊(None),例如 [7] 回傳空的、[6, 0] 只剩 [6]。

正確解法
#

class Solution:
    def increasingBST(self, root: TreeNode) -> TreeNode:
        dummy = tail = TreeNode()
        stack, cur = [], root
        while cur or stack:
            while cur:
                stack.append(cur)
                cur = cur.left
            cur = stack.pop()
            cur.left = None
            tail.right = tail = cur
            cur = cur.right
        return dummy.right

複雜度
#

時間 O(n),空間 O(h)。

要特別避免的錯誤
#

  • 移動的是 tail,dummy 要留在原地,才能回傳頭。
  • 設 cur.left = None 不會影響遍歷:它的左子樹已經處理完了。

面試口說整理
#

我用迭代的中序遍歷由小到大拿節點,把每個節點接到尾巴的右邊並清掉左小孩,最後回傳 dummy 的右邊。時間 O(n)。

相關文章

LeetCode 783: Minimum Distance Between BST Nodes
·1 分鐘
LeetCode Easy Tree Depth-First-Search Breadth-First-Search Binary-Search-Tree
LeetCode 783 解題筆記:BST 的中序是由小到大,最小差一定出現在中序相鄰的兩個值之間;記住前一個值逐一比較
LeetCode 589: N-ary Tree Preorder Traversal
·1 分鐘
LeetCode Easy Stack Tree Depth-First-Search
LeetCode 589 解題筆記:N 叉樹的前序,先記錄自己,再依序處理每個小孩;遞迴結果要用 extend 攤平,不是 append 一個 list
LeetCode 590: N-ary Tree Postorder Traversal
·1 分鐘
LeetCode Easy Stack Tree Depth-First-Search
LeetCode 590 解題筆記:後序是先每個小孩再自己;迭代時可以做「根、小孩由右到左」的前序再整個反轉
LeetCode 501: Find Mode in Binary Search Tree
·1 分鐘
LeetCode Easy Tree Depth-First-Search Binary-Search-Tree Binary-Tree
LeetCode 501 解題筆記:BST 中序是排序的,相同的值會連在一起;中序時數目前這段的長度,比最大值大就重設答案,一樣大就加入
LeetCode 145: Binary Tree Postorder Traversal
·1 分鐘
LeetCode Easy Stack Tree Depth-First-Search Binary-Tree
LeetCode 145 解題筆記:迭代的後序遍歷,節點第一次彈出時標記後放回去,再依序推右、左小孩;第二次彈出才記錄
LeetCode 144: Binary Tree Preorder Traversal
·1 分鐘
LeetCode Easy Stack Tree Depth-First-Search Binary-Tree
LeetCode 144 解題筆記:迭代的前序遍歷,彈出就記錄,先推右小孩再推左小孩,左邊才會先處理