題目描述:給定 BST 和兩個節點 p、q,找出它們的最低公共祖先(LCA)。
解題思路:利用 BST 的有序性質:若 p 和 q 的值都小於當前節點,則 LCA 在左子樹;若都大於,則在右子樹;否則當前節點就是 LCA(一個在左、一個在右,或其中一個就是當前節點)。不需要像普通二元樹 LCA 那樣全樹搜尋。
時間複雜度:O(h),h 為樹高(平衡 BST 為 O(log n),最壞為 O(n))。
空間複雜度:O(1) — 迭代解法,不用遞迴棧。
1. While root != null: a. If both p and q < root.val: go left b. If both p and q > root.val: go right c. Else: return root (this is the LCA) 2. Return null
遍歷至根 O(n) 時間,O(1) 空間:將路徑存為集合,或多次遍歷找共同祖先 — 時間複雜度更差。
遞迴全樹 O(n) 時間,O(h) 空間:不利用 BST 特性,遞迴搜尋整棵樹 — 時間複雜度更差。