Leetcode236经典题目二叉树的最近公共祖先

本次为大家带来的题目是leetcode236二叉树的最近公共祖先
在这里插入图片描述
本道题的直观思路是自底向上进行寻找,如果存在的话那么向上返回,如何能够自底向上遍历呢?我们可以利用回溯进行处理,那么需要注意的是进行回溯的时候一定要使用后序遍历来操作,因为后序遍历的顺序是左、右、根,那么在根节点也就是我们进行判断的操作了。
下面说下可能存在的情况
1.如果当前节点的左和右子树都不为空,那么说明找到了公共祖先,直接返回。
2.假如节点左子树为空,右子树不为空,说明我们要继续向上返回。同理右子树为空左子树不为空也要返回。
具体的代码实现如下:

class Solution {
      public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        //终止条件
        if(root==null) return null;
        //如果当前节点为q或p直接返回
        if(root==p||root==q) return root;
        //后序遍历
        //左
       TreeNode left = lowestCommonAncestor(root.left,p,q);
       //右
       TreeNode right = lowestCommonAncestor(root.right,p,q);
       //根
       //左右都不为空,说明存在q,p
       if(left!=null&&right!=null){
        return root;
       }else if(left!=null &&right==null){
        return left;
       }else if(right!=null&&left==null){
        return right;
       }else{
        return null;
       }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值