LC236

LC link

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的左右子樹

    1. 如果左右子樹的遞歸都有結果,說明p、q分居root左右子樹,return root
    2. 如果只有一個子樹遞歸調用有結果,說明p、q都在這個子樹,返回子樹遞歸的結果
    3. 如果兩個子樹遞歸結果都爲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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章