# \#235 Lowest Common Ancestor of a Binary Search Tree
## *給定一個二元搜尋樹, 找到LCA*
## Log
- build 20210515 by syhuang
## 遞迴版
- 實作遞迴版
```javascript=
var lowestCommonAncestor = function(root, p, q) {
var isBetween = (root.val-p.val)*(root.val-q.val)<0;
return isBetween?root:
lowestCommonAncestor(root.val>p.val?root.left:root.right,p,q);
};
```
## 改進初見
- 改進"判斷區間"邏輯: 判斷一個數是否為兩數的區間, 可以對兩數相減之後的乘積正負來判斷(可讀性稍微下降)
```javascript=
var lowestCommonAncestor = function(root, p, q) {
var node = root;
while(node){
if((node.val-p.val)*(node.val-q.val)<=0) break;
node = (node.val>p.val)?node.left:node.right;
}
return node;
};
```
## 初見
- 基本邏輯:LCA值一定是[p,q], 即介於p和q之間, pq含在內, 實作此邏輯
```javascript=
var lowestCommonAncestor = function(root, p, q) {
var node = root;
while(node){
if(node.val == p.val || node.val == q.val) break;
if(isBetween(node.val,p.val,q.val)) break;
node = (node.val>p.val)?node.left:node.right;
}
return node;
function isBetween(comp,a,b){//判斷某數是否在a,b區間內(包含ab), ab沒有大小分別
if(comp<=a && comp>=b) return true;
if(comp>=a && comp<=b) return true;
return false;
}
};
```
## 備註
- 遞迴和一般解法在時間與空間複雜度上差異不大
## 參考
###### tags: `leetcode`, `leetcode-easy`