二叉树的最近公共祖先

132 阅读1分钟

题目描述

leetcode-cn.com/problems/lo…

分析

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @param {TreeNode} p
 * @param {TreeNode} q
 * @return {TreeNode}
 */
var lowestCommonAncestor = function(root, p, q) {
    
};

题目只给了一个根节点,因此关键在于找到一个遍历方法,能让代码通过递归的方式找到 p, q 的最近祖先

解题思路

通过递归来进行遍历

算法

递归

思路

对于一个节点,pq 两节点的 LCA 只可能在它的左右两边或在一边

递归

在递归中,每次递归返回两节点的 LCA,首先检查遍历到的节点是否为空,如果为空直接

如果当前节点是 p, q 中的其中一个,说明 LCA 只可能在上边或者是当前节点,因此返回当前节点

递归左树和右树

如果不是上面的情况,说明要到它的左树和右树进行查找

如果左树和右树都找到了 p, q,那么返回 root,否则返回递归回来的其中一个值,此时说明 LCA 在左树或右树

代码

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @param {TreeNode} p
 * @param {TreeNode} q
 * @return {TreeNode}
 */
var lowestCommonAncestor = function (root, p, q) {
    if (!root) return
    if (root === p || root === q) return root

    const l = lowestCommonAncestor(root.left, p, q)
    const r = lowestCommonAncestor(root.right, p, q)

    if (l && r) return root
    return l || r
}