BST的最小共同祖先(LCA) | Medium | LeetCode#235. Lowest Common Ancestor of a Binary Search Tree
題目敘述
- 題目難度:
Medium
- 題目描述:給定一個BST, 求在BST內任意兩節點的最小共同祖先,其中自己可以是自己的祖先,求任意兩節點
p
,q
的LCA
解法
一開始的想法
首先一定是先 traversal 查找 p
, q
兩節點,而我的想法是,如果用 post-traversal 來走訪測資一,這樣對於任意兩節點,假設是 3
,或是 5
這兩個元素的 caller(當前遞迴節點) 會是 4
,而對於 5
或是 7
這兩個的caller會是節點 6
。因此其實就是要找同時具有 p
跟q
節點返回值的那層 caller 就會是 LCA
我的解法
1 | TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { |
1 | if (root == p || root == q) return root; |
上面可以看到,如果traverse 找到 p
或者 q
則直接返回。
如果同時找到 leftNode
跟 rightNode
則當前節點就是LCA,而如果只有其中一個節點返回,那當前節電同時會是 p
或 q
並且自己就是自己的祖先
但是上面這種做法其實不限於 BST, 其他 binary tree 也能用,如果是 BST 其實不用那麼麻煩,因為已經排序好了,而且BST本來就是設計來讓你找節點用的:
p、q
都比root
小 → 走左p、q
都比root
大 → 走右
而其他狀況root都是LCA:
- root 本來就是 q 或 p
q < root < p
p < root < q
1 | class Solution { |
執行結果
複雜度
時間複雜度
$O(LogN)$ -> 二元查找
空間複雜度
$O(1)$
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Kevin Liu's 部落格 || Technical || Travel!
評論