TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
auto pathTo = [&](TreeNode* target) {
vector<TreeNode*> path;
TreeNode* node = root;
while (node) {
path.push_back(node);
if (target->val < node->val) node = node->left;
else if (target->val > node->val) node = node->right;
else break;
}
return path;
};
vector<TreeNode*> a = pathTo(p);
vector<TreeNode*> b = pathTo(q);
TreeNode* lca = root;
for (size_t i = 0; i < min(a.size(), b.size()) && a[i] == b[i]; i++) lca = a[i];
return lca;
}
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
List<TreeNode> a = pathTo(root, p);
List<TreeNode> b = pathTo(root, q);
TreeNode lca = root;
for (int i = 0; i < Math.min(a.size(), b.size()) && a.get(i) == b.get(i); i++) lca = a.get(i);
return lca;
}
private List<TreeNode> pathTo(TreeNode root, TreeNode target) {
List<TreeNode> path = new ArrayList<>();
TreeNode node = root;
while (node != null) {
path.add(node);
if (target.val < node.val) node = node.left;
else if (target.val > node.val) node = node.right;
else break;
}
return path;
}
def lowest_common_ancestor(root, p, q):
def path_to(target):
path = []
node = root
while node:
path.append(node)
if target.val < node.val: node = node.left
elif target.val > node.val: node = node.right
else: break
return path
a = path_to(p)
b = path_to(q)
lca = root
i = 0
while i < min(len(a), len(b)) and a[i] is b[i]:
lca = a[i]
i += 1
return lca
function lowestCommonAncestor(root: TreeNode | null, p: TreeNode, q: TreeNode): TreeNode | null {
const pathTo = (target: TreeNode): TreeNode[] => {
const path: TreeNode[] = [];
let node = root;
while (node) {
path.push(node);
if (target.val < node.val) node = node.left;
else if (target.val > node.val) node = node.right;
else break;
}
return path;
};
const a = pathTo(p);
const b = pathTo(q);
let lca = root;
for (let i = 0; i < Math.min(a.length, b.length) && a[i] === b[i]; i++) lca = a[i];
return lca;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (!root || root == p || root == q) return root;
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);
if (left && right) return root;
return left ? left : right;
}
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null || root == p || root == q) return root;
TreeNode left = lowestCommonAncestor(root.left, p, q);
TreeNode right = lowestCommonAncestor(root.right, p, q);
if (left != null && right != null) return root;
return left != null ? left : right;
}
def lowest_common_ancestor(root, p, q):
if not root or root is p or root is q: return root
left = lowest_common_ancestor(root.left, p, q)
right = lowest_common_ancestor(root.right, p, q)
if left and right: return root
return left or right
function lowestCommonAncestor(root: TreeNode | null, p: TreeNode, q: TreeNode): TreeNode | null {
if (!root || root === p || root === q) return root;
const left = lowestCommonAncestor(root.left, p, q);
const right = lowestCommonAncestor(root.right, p, q);
if (left && right) return root;
return left ?? right;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (!root) return nullptr;
if (p->val < root->val && q->val < root->val) return lowestCommonAncestor(root->left, p, q);
if (p->val > root->val && q->val > root->val) return lowestCommonAncestor(root->right, p, q);
return root;
}
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null) return null;
if (p.val < root.val && q.val < root.val) return lowestCommonAncestor(root.left, p, q);
if (p.val > root.val && q.val > root.val) return lowestCommonAncestor(root.right, p, q);
return root;
}
def lowest_common_ancestor(root, p, q):
if not root: return None
if p.val < root.val and q.val < root.val: return lowest_common_ancestor(root.left, p, q)
if p.val > root.val and q.val > root.val: return lowest_common_ancestor(root.right, p, q)
return root
function lowestCommonAncestor(root: TreeNode | null, p: TreeNode, q: TreeNode): TreeNode | null {
if (!root) return null;
if (p.val < root.val && q.val < root.val) return lowestCommonAncestor(root.left, p, q);
if (p.val > root.val && q.val > root.val) return lowestCommonAncestor(root.right, p, q);
return root;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
int lo = min(p->val, q->val);
int hi = max(p->val, q->val);
TreeNode* node = root;
while (node) {
if (node->val < lo) node = node->right;
else if (node->val > hi) node = node->left;
else return node;
}
return nullptr;
}
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
int lo = Math.min(p.val, q.val);
int hi = Math.max(p.val, q.val);
TreeNode node = root;
while (node != null) {
if (node.val < lo) node = node.right;
else if (node.val > hi) node = node.left;
else return node;
}
return null;
}
def lowest_common_ancestor(root, p, q):
lo = min(p.val, q.val)
hi = max(p.val, q.val)
node = root
while node:
if node.val < lo: node = node.right
elif node.val > hi: node = node.left
else: return node
return None
function lowestCommonAncestor(root: TreeNode | null, p: TreeNode, q: TreeNode): TreeNode | null {
const lo = Math.min(p.val, q.val);
const hi = Math.max(p.val, q.val);
let node = root;
while (node) {
if (node.val < lo) node = node.right;
else if (node.val > hi) node = node.left;
else return node;
}
return null;
}