剑指 Offer 68 - II. 二叉树的最近公共祖先

深度优先查找
一开始就是普通递归,然后找到之后进行分条件的判断
就三种情况,

  1. 当前结点root的左右两个结点为p、q,则当前结点就是最近公共祖先结点
  2. 当前结点为p,那么p即当前结点为最近公共祖先结点
  3. 当前结点为q,那么q即当前结点为最近公共祖先结点

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        /** 递归终止的边界为 当前结点为空,或者当前结点为p,或者q
         * =找到之后,就直接返回该结点*/
        if (root == null || root == p || root == q) return root;

		/** 深度优先,不断的往左和右下面去寻找*/
        /** 问题与子问题间的关系
         * 如果左边找到了,右边却没有找到,就直接返回找到的左边的结点,反之,
         * 如果左边和右边都找到了,就返回当前结点*/
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);

		/**如果在某个为值找到了(也就是不在进行递归,深度优先查找找到头了)要么找到left,要么找到right 或者 都找到了,就刚好对应着以上的三种情况*/
		/**然后向上返回 最近公共结点*/
        if (left != null && right != null){
             return root;
        }else if (left != null){
            return left;
        }else {
            return right;
        }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值