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 < pp < root < q
1 | class Solution { |
執行結果

複雜度
時間複雜度
$O(LogN)$ -> 二元查找
空間複雜度
$O(1)$
本部落格所有文章除特別聲明外,均採用CC BY-NC-SA 4.0 授權協議。轉載請註明來源 Kevin Liu's 部落格 || Technical || Travel!
評論










