题目描述
分析
/**
* 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 的最近祖先
解题思路
通过递归来进行遍历
算法
递归
思路
对于一个节点,p,q 两节点的 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
}