【LeetCode】二叉樹的最近公共祖先

題目

題目

思路

遞歸

  • 最近公共祖先x滿足:
    x的左右子樹分別包含p節(jié)點(diǎn)或q節(jié)點(diǎn),或者x恰好是p節(jié)點(diǎn)或q節(jié)點(diǎn)且它的左子樹或右子樹有一個包含了另一個節(jié)點(diǎn)
class Solution {
  private TreeNode ans = null;
  private boolean dfs(TreeNode root, TreeNode p, TreeNode q) {
    if (root == null) {
      return false;
    }
    boolean lChild = dfs(root.left, p, q);
    if (lChild && (root == p || root ==q)) {
      ans = root;
      return true;
    }
    boolean rChild = dfs(root.right, p ,q);
    if (rChild && (root == p || root ==q)) {
      ans = root;
      return true;
    }
    if (lChild && rChild) {
      ans = root;
      return true;
    }
    return lChild || rChild || root == p || root ==q;
  }
  
  public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    dfs(root, p, q);
    return ans;
  }
}

存儲父節(jié)點(diǎn)

遍歷二叉樹使用哈希表存儲所有節(jié)點(diǎn)的父節(jié)點(diǎn),利用父節(jié)點(diǎn)信息從p節(jié)點(diǎn)開始不斷往上跳,并記錄已經(jīng)訪問過的節(jié)點(diǎn),再從q節(jié)點(diǎn)開始不斷往上跳,得到最先碰到的已經(jīng)訪問過的節(jié)點(diǎn)。

class Solution {
  // <child, parent>
  Map<TreeNode, TreeNode> parent = new HashMap<>();
  Set<TreeNode> visited = new HashSet<>();
  public void dfs(TreeNode root) {
    if (root.left != null) {
      parent.put(root.left, root);
      dfs(root.left);
    }
    if (root.right != null) {
      parent.put(root.right, root);
      dfs(root.right);
    }
  }

  public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    dfs(root);
    while (p != null) {
      visited.add(p);
      p = parent.get(p);
    }
    while (q != null) {
      if (visited.contains(q)) {
        return q;
      }
      q = parent.get(q);
    }
    return null;
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容