LeetCode 剑指offer Q68 -ll 二叉树的最近公共祖先

思路

接着67题。这一题就是一般情况,就是一棵普通的二叉树没有顺序。那如何求解呢?

  1. 比较容易想到的就是用dfs找到到达pq的两条路径,然后进行比对找到最近的相同点。但是这种方法在递归完之后还要进行处理效率比较低。

  2. 我们设计一个递归函数dfs
    1)当当前节点root就是p或者q时,则直接返回该节点。
    2)分别递归进入root的左右子树得到两个节点left和right。这两个节点表示了左右子树中是否含有p或q。

    i.若正好left和right就是p和q,那么直接返回root这个节点就好了,root就是我们要找的最近的公共节点。
    ii. 若发现left=null且right=null,则说明root这棵树不存在pq节点,则return null。 
    iii. 若发现left和right中一个为null另一个不为null,则说明不为null的这个值就是从下面返回的最近的公共节点,直接返回这个节点即可。
    

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null) return null;
        if(root.val==p.val) return p;
        if(root.val==q.val) return q;
        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;
        return left!=null?left:right;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值