LCA === lowestCommonAncestor
給定一個二叉樹 找到該樹中兩個指定節點的最近公共祖先
對於根節點root、p、q的分佈 存在兩種可能
- p、q分居root的左右子樹,則LCA爲root
- p、q存在於root的同一側子書中,就變成了規模小一點的相同問題
定義遞歸函數
遞歸函數: return當前子樹 中p & q 的LCA 如果沒有LCA就返回null
從根節點root開始往下遞歸遍歷
-
如果遍歷到p、q,比如說p,則LCA要麼是當前的p(q在p的子樹中),那麼是p之上的節點(q不在p的子樹中),不可能是p之下的節點,不用在繼續往下走,返回當前的p
-
當遍歷到null節點,空樹不存在p、q,沒有LCA return null
-
當遍歷到節點root不是p、q、null,就遞歸搜尋root的左右子樹
- 如果左右子樹的遞歸都有結果,說明p、q分居root左右子樹,return root
- 如果只有一個子樹遞歸調用有結果,說明p、q都在這個子樹,返回子樹遞歸的結果
- 如果兩個子樹遞歸結果都爲null,說明p、q都不在這輛子樹中, return null
const lowestCommonAncestor = (root, p, q) => {
if (root === null) return null;
if ([p, q].includes(root)) return root
const left = lowestCommonAncestor(root.left, p, q);
const right = lowestCommonAncestor(root.right, p, q);
if (left && right) return root;
if (left === null) return right
return left
}