Medium草稿★★★★★O(h) 時間 · O(h) 空間
TreeBSTRecursion
Patterns🌳 樹形 DFS
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

701Insert into a Binary Search TreeTreesMediumTrees

給定一棵 BST 的根節點和一個要插入的值,將該值插入 BST 中並回傳根節點。保證插入的值在原樹中不存在。可以回傳任意一個合法的結果。

Example:

Input: root = [4,2,7,1,3], val = 5 Output: [4,2,7,1,3,5]

Intuition

TIP

利用 BST 性質,比較值的大小決定往左或往右走,找到空位插入。

Approaches

⭐ 1. Recursive — O(h) / O(h)
  • Idea: 遞迴比較值,找到 null 位置時建立新節點回傳
  • Time: O(h),h 為樹高,平均 O(log n),最差 O(n)
  • Space: O(h),遞迴堆疊深度
class Solution {
    fun insertIntoBST(root: TreeNode?, `val`: Int): TreeNode? {
        if (root == null) return TreeNode(`val`)
        if (`val` < root.`val`) {
            root.left = insertIntoBST(root.left, `val`)
        } else {
            root.right = insertIntoBST(root.right, `val`)
        }
        return root
    }
}
2. Iterative — O(h) / O(1)
  • Idea: 迭代找到插入位置的父節點,直接掛上新節點
  • Time: O(h)
  • Space: O(1)
class Solution {
    fun insertIntoBST(root: TreeNode?, `val`: Int): TreeNode? {
        val newNode = TreeNode(`val`)
        if (root == null) return newNode
        var curr = root
        while (curr != null) {
            if (`val` < curr.`val`) {
                if (curr.left == null) {
                    curr.left = newNode
                    return root
                }
                curr = curr.left
            } else {
                if (curr.right == null) {
                    curr.right = newNode
                    return root
                }
                curr = curr.right
            }
        }
        return root
    }
}

🔑 Takeaways

Ladders 看全部 →

🌲

BST 操作

利用中序遞增性質做查驗與增刪。

  1. 1#98Validate Binary Search TreeMedium驗證 BST:用上下界遞迴
  2. 2#230Kth Smallest Element in a BSTMedium第 k 小:中序遍歷第 k 個
  3. 3
  4. 4#450Delete Node in a BSTMedium刪除節點:三種情況與後繼替換