DAILY DOCDAILY DOC
Rust
Node
Notes
Ubuntu
Leetcode
  • it-tools
  • excalidraw
  • linux-command
Rust
Node
Notes
Ubuntu
Leetcode
  • it-tools
  • excalidraw
  • linux-command
  • Array

    • 数组
    • 二分查找
    • moveZeros
  • Dynamic-programming

    • 动态规划
  • 刷题指南
  • String

    • 字符串
  • bitwise-operator

    • 位运算符
  • heap
  • history

    • [1014] 最佳观光组合
    • [1022] 从根到叶的二进制数之和
    • [104] 二叉树的最大深度
    • [11] 盛最多水的容器
    • [110] 平衡二叉树
    • [1227] 飞机座位分配概率
    • [129] 求根节点到叶节点数字之和
    • [1306] 跳跃游戏 III
    • [148] 排序链表
    • 155.最小栈
    • [165] 比较版本号
    • 1763. 最长的美好子字符串
    • [1870] 准时到达的列车最小时速
    • [199] 二叉树的右视图
    • [21] 合并两个有序链表
    • 215.数组中的第 k 个最大元素
    • [2306] 公司命名
    • [234] 回文链表
    • [2516] 每种字符至少取 K 个
    • [316] 去除重复字母
    • [3171] 找到按位或最接近 K 的子数组
    • [322] 零钱兑换
    • [41] 缺失的第一个正数
    • [44] 通配符匹配
    • [494] 目标和
    • [509] 斐波那契数
    • [518] 零钱兑换 II
    • [62] 不同路径
    • [676] 实现一个魔法字典
    • 70 爬楼梯
    • [718] 最长重复子数组
    • [78] 子集
    • [82] 删除排序链表中的重复元素 II
    • [871] 最低加油次数
    • [88] 合并两个有序数组
    • [887] 鸡蛋掉落
    • 958.二叉树的完全性检验
    • [98] 验证二叉搜索树
    • [983] 最低票价
    • leetcode practice
    • 约瑟夫问题
    • 移除重复节点
  • linked-list

    • 706. 设计哈希映射
    • 链表
  • stack

    • stack
  • tree

    • Tree Traversal
    • 二叉树的最近公共祖先
    • 二叉树
    • 题目
  • leetCode 刷题
  • 回溯
  • 排序算法

二叉树的最近公共祖先

1676. 二叉树的最近公共祖先 IV

details
/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @param {TreeNode[]} nodes
 * @return {TreeNode}
 *
 */
var lowestCommonAncestor = function(root, nodes) {
  // 把 nodes 转换成 hashmap
  const map = Object.create(null);
  for (let node of nodes) {
    map[node.val] = 1;
  }
  return find(root, map);

  //
  function find(root, map) {
    if (root === null) return null;
    if (map[root.val]) {
      return root;
    }
    const left = find(root.left, map);
    const right = find(root.right, map);
    // 左右子树都包含 节点的值
    if (left !== null && right !== null) {
      return root;
    }
    // 其中一个节点就是 LCA
    return left ? left : right;
  }
};


236. 二叉树的最近公共祖先

details


/**
 * 236. 二叉树的最近公共祖先
 *
 * @param {TreeNode} root
 * @param {TreeNode} p
 * @param {TreeNode} q
 * @return {TreeNode}
 */
var lowestCommonAncestor = function(root, p, q) {
  return find(root, p.val, q.val);

  function find(root, p, q) {
    if (!root) return null;
    if (root.val === p || root.val === q) {
      return root;
    }
    const left = find(root.left, p, q);
    const right = find(root.right, p, q);

    if (left && right) {
      return root;
    }
    return left ? left : right;
  }
};

1644. 二叉树的最近公共祖先 II

details


/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * 1644. 二叉树的最近公共祖先 II  后序遍历
 *
 * @param {TreeNode} root
 * @param {TreeNode} p
 * @param {TreeNode} q
 * @return {TreeNode}
 */
var lowestCommonAncestor = function(root, p, q) {
  // 标记 值 都需要被找到 ,否则返回null
  let findLeft = false;
  let findRight = false;
  // 2个节点都需要存在
  if (!p || !q) return null;

  const ans = find(root, p.val, q.val);
  if (!findLeft || !findRight) return null;
  return ans;

  function find(root, val1, val2) {
    //
    if (!root) return null;

    const left = find(root.left, val1, val2);
    const right = find(root.right, val1, val2);

    if (left && right) {
      return root;
    }

    if (root.val === val1 || root.val === val2) {
      root.val === val1, (findLeft = true);
      root.val === val2, (findRight = true);
      // 代表找到当前值
      return root;
    }
    return left ? left : right;
  }
};

235. 二叉搜索树的最近公共祖先

details

/**
 *  235. 二叉搜索树的最近公共祖先
 * @param {TreeNode} root
 * @param {TreeNode} p
 * @param {TreeNode} q
 * @return {TreeNode}
 */
var lowestCommonAncestor = function(root, p, q) {
  const min = p.val < q.val ? p.val : q.val;
  const max = p.val < q.val ? q.val : p.val;
  return find(root, min, max);

  function find(root, min, max) {
    if (!root) return null;
    if (root.val > max) {
      return find(root.left, min, max);
    }
    if (root.val < min) {
      return find(root.right, min, max);
    }
    return root;
  }
};

1650. 二叉树的最近公共祖先 III

details

/**
 * 1650. 二叉树的最近公共祖先 III
 * @param {Node} node
 * @return {Node}
 */
var lowestCommonAncestor = function(p, q) {
  let left = p;
  let right = q;
  while (left !== right) {
    if (!left) {
      left = q;
    } else {
      left = left.parent;
    }

    if (!right) {
      right = p;
    } else {
      right = right.parent;
    }
  }
  return left;
};

Last Updated:
Contributors: rosendo
Prev
Tree Traversal
Next
二叉树