Skip to content

Instantly share code, notes, and snippets.

@revanth0212
Created June 24, 2018 18:32
Show Gist options
  • Save revanth0212/d36f593d2d5e141baa64210c50ff757d to your computer and use it in GitHub Desktop.
Save revanth0212/d36f593d2d5e141baa64210c50ff757d to your computer and use it in GitHub Desktop.
Find the lowest common ancestor of 2 nodes in a BST.
class Relationship {
constructor(root) {
this.relObj = {}
this.iterate(root, null, 0)
}
iterate(root, parent, level) {
if (root) {
this.relObj[root.val] = { level: level, parent: parent }
this.iterate(root.left, root, level + 1)
this.iterate(root.right, root, level + 1)
}
}
getParent(node) {
return (this.relObj[node.val] || {}).parent
}
getLevel(node) {
return (this.relObj[node.val] || {}).level
}
}
var moveQToPsLevel = function (p, q, rel) {
let pLevel = rel.getLevel(p)
let qLevel = rel.getLevel(q)
while(qLevel > pLevel) {
q = rel.getParent(q)
qLevel = rel.getLevel(q)
}
return { p: p, q: q }
}
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @param {TreeNode} p
* @param {TreeNode} q
* @return {TreeNode}
*/
var lowestCommonAncestor = function(root, p, q) {
var rel = new Relationship(root)
let pLevel = rel.getLevel(p)
let qLevel = rel.getLevel(q)
if (pLevel < qLevel) {
var newPQ = moveQToPsLevel(p, q, rel)
p = newPQ.p
q = newPQ.q
} else if (pLevel > qLevel) {
var newPQ = moveQToPsLevel(q, p, rel)
p = newPQ.q
q = newPQ.p
}
if (p.val === q.val) {
return p
} else {
while(rel.getParent(p).val !== rel.getParent(q).val) {
p = rel.getParent(p)
q = rel.getParent(q)
}
return rel.getParent(p)
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment