算法通关村第8关【黄金】| 寻找祖先问题

算法通关村第8关【黄金】| 寻找祖先问题_第1张图片

 思路:递归三部曲

第一步:确定参数和返回值

题目要求找到指定的结点,就需要返回结点。

题目又涉及到p,q就需要传入p,q,需要遍历传入root

第二步:确定终止条件

当遍历到结点为空说明到底没找到返回空

或者遍历到p,q目标结点返回目标结点

第三步:确定单层逻辑

首先要找到最近公共结点和p,q有什么特别关系

一种情况就是p,q在root的左右子树上

最近祖先就是当left和right都不为空时

二种情况就是p,q本身就是最近公共祖先,p/q在左右子树上

这种情况遍历到的第一个目标p/q就是题目所要的最近公共祖先返回即可

其他所有的结点都是null即不是目标结点,直接将搜索到的第一个p/q(不是null的结点)一路返回

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null || root == p || root == q){
            return root;
        }
        TreeNode left = lowestCommonAncestor(root.left,p,q);
        TreeNode right = lowestCommonAncestor(root.right,p,q);
        if(left == null && right == null){
            return null;
        }
        if(left != null && right != null){
            return root;
        }
        if(left != null){
            return left;
        }
        if(right != null){
            return right;
        }
        return root;
    }
}

你可能感兴趣的:(算法,算法,leetcode)