二叉树的最近公共祖先

91 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情

二叉树的最近公共祖先

描述

给定一个二叉树,找到该树中两个指定节点的最近公共祖先节点。

image.png

例如给定节点5和1,则最近公共祖先节点是根节点3;如果给定的节点是5和2,最近的公共组件节点就是节点5本身。

需要找到的结果与上篇二叉搜索树一致,只是方法不同。

分析

本题给出的是二叉树,而不是二叉搜索树,因为二叉搜索树对子树节点的值有特定规则,我们可以根据节点值的大小进行判断给出的两个节点是否分别属于某个节点的左右两个子树,从而来进行判断,相对来说比较简单一点。

而二叉树节点的值是杂乱无章的,并没有任何规律,只是每个节点值不同。

还记得在二叉搜索树中我们判断了两种情况可以确定最近的公共祖先节点:

  1. 当根节点值等于给出的两个节点值中的任何一个,则最近的公共祖先节点就是当前根节点值;
  2. 当给出的两个节点分别属于某个根节点的左右子树,则当前节点也是这两个给出节点的最近公共祖先节点。

二叉树虽然无法很方便的根据值大小来判断,但这两条总体思路还是一样的。我们只要判断给出的两个节点分别属于当前根节点的左右子树,则当前根节点就是最近的公共祖先节点。

编程实现

根据以上分析,具体代码实现如下:

var lowestCommonAncestor = function(root, p, q) {
  // 如果给定的两个节点有一个与根节点相等,则返回当前根节点
  if (root === null || root.val === p.val || root.val === q.val) return root
  let left = lowestCommonAncestor(root.left, p, q)
  let right = lowestCommonAncestor(root.right, p, q)
  if (left === null) return right
  if (right === null) return left
  return root
};