每日一算法之公共祖先

4 阅读1分钟

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

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出:3解释:节点 5 和节点 1 的最近公共祖先是节点 33       / \      5   1     / \ / \    6  2 0  8      / \     7   4

首先我们分为几种情况

● 考虑root为空的树,那就返回为null

● 如果当前树只有一个节点,比如3,传入的左右节点都为3,那么返回也是3

● 如果是传入为(root,5,1),那我们先在左子树中查找,找到5那就返回,找到1,立刻返回,那么他们的公共组先就是root

● 如果是(root,5,4),同上查找方式,左边找到了5直接返回,右边没有找到,那就以根节点为1,p为5,q为4进行继续查找,,没有就一直找,然后返回为null,那就说明5和4都不在右边的树里面,那就应该左边的树里面,我们看到了5,但是没有找到4,说明4在5的子孙节点里面,那么5就是他们的公共祖先。

function lowestCommonAncestor(root,p,q){    if(!root || root === p || root === q) return root;    const left = lowestCommonAncestor(root.left,p,q)    const right = lowestCommonAncestor(root.right,p,q)    if(left && right){        return root    }    return left || right}