# 236. Lowest Common Ancestor of a Binary Tree
node {
left
right
}
Lonlg Common Anestor
root, p, q
two node for their
1. recursive for reach node, return potential LCA
2. if find p or q return
4. if left and right are not None -> i am LCA
5. if one (l or r) is not None -> return potential LCA
4. if one (l or r) is not None -> propagate to parent node
a. truly LCA
b. potentially one side of LCA
p->LCA LCA->root q->LCA = q->LCA LCA->root p->LCA
======
0
1 2
3 4
p = 3, q = 1
=======
```python=
def lca(root, p, q):
def helper(node):
if not node or node == p or node == q:
return node
l = helper(node.left)
r = helper(node.right)
if l and r:
# LCA
return node
# one side is LCA, potential LCA
return l or r
return helper(root)
```
Given a string s, return true if the s can be palindrome after deleting at most one character from it.
# two pointer from left rght
# def helper(leftm right)
# return (left +1 , right) (left , right-1)
```python=
def findPalindrome(s):
self.idx = -1
def helper(left, right, skip):
while left < right:
if s[left] != s[right]:
if skip == 0:
return False
a = helper(left+1, right, skip-1)
if a:
self.idx = left
return True
b = helper(left, right-1, skip-1)
if b:
self.idx = right
return True
left += 1
right -= 1
return True
ret = helper(0, len(s)-1, 1)
if ret:
if self.idx == -1:
return s
return s[:self.idx] + s[self.idx+1:]
return ""
# TC O(N)
```
###### tags: `mock interview` `面試`