###### tags: `Week_2`, `Binary Search Tree`
# Binary Search Tree
## 98. [Validate Binary Search Tree](https://leetcode.com/problems/validate-binary-search-tree/)
harry:
https://github.com/harryuan65/Grindy-Viking/blob/master/Medium/98.validate-binary-search-tree/images/solution.png
```ruby=1
def is_valid_bst(root)
validate(root, -Float::INFINITY, Float::INFINITY)
end
def validate(node, min, max)
val = node.val
left = node.left
right = node.right
self_valid = val.between?(min, max)
return self_valid if left.nil? && right.nil?
self_valid &&= left.val < val if left
self_valid &&= right.val > val if right
min_valid = val > min
min_valid &&= left.val > min if left
min_valid &&= right.val > min if right
max_valid = val < max
max_valid &&= left.val < max if left
max_valid &&= right.val < max if right
return false unless min_valid && max_valid
children_valid = true
children_valid &&= validate(left, min, val) if left
children_valid &&= validate(right, val, max) if right
min_valid && max_valid && self_valid && children_valid
end
```
harry(2)
https://github.com/harryuan65/Grindy-Viking/blob/master/Medium/98.validate-binary-search-tree/images/solution2.png
```ruby=1
def is_valid_bst(root)
validate(root, -Float::INFINITY, Float::INFINITY)
end
def validate(node, min, max)
val = node.val
valid = val > min && val < max
valid &&= validate(node.left, min, node.val) if node.left
valid &&= validate(node.right, node.val, max) if node.right
valid
end
```
sam:
```python=1
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def isValidBST(self, root: Optional[TreeNode]) -> bool:
inorder_list = []
def inorder(root):
if root is None:
return
inorder(root.left)
inorder_list.append(root.val)
inorder(root.right)
inorder(root)
if len(inorder_list) == 1:
return True
for i in range(1, len(inorder_list)):
if inorder_list[i] <= inorder_list[i-1]:
return False
return True
```
hazel:
```typescript=1
```
Beny
```csharp=
public class Solution {
public bool IsValidBST(TreeNode root) {
if(root == null){
return false;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode pre = null;
while(root != null || stack.Count > 0){
while(root != null){
stack.Push(root);
root = root.left;
}
root = stack.Pop();
if(pre != null && root.val <= pre.val){
return false;
}
pre = root;
root = root.right;
}
return true;
}
}
```
## 235. [Lowest Common Ancestor of a Binary](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/)
harry:
```ruby=1
```
sam:
```python=1
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
p_val = p.val
q_val = q.val
while root:
if root.val > p_val and root.val > q_val:
root = root.left
elif root.val < p_val and root.val < q_val:
root = root.right
else:
return root
```
hazel:
```typescript=1
```
Beny
```csharp=
public class Solution {
public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
TreeNode pre = root;
int big,small;
if(p.val > q.val){
big = p.val;
small = q.val;
}else{
big = q.val;
small = p.val;
}
while(pre != null){
if(pre.val >= small && pre.val <= big){
return pre;
}else if(pre.val <= small){
pre = pre.right;
}else if(pre.val >= big){
pre = pre.left;
}
}
return p;
}
}
```