二叉树中的最近公共祖先

对于二叉树中任意两个结点p和q,可能存在如下的情形:

  • p是q的祖先,此时p是p和q的最近公共祖先
  • q是p的祖先,此时q是p和q的最近公共祖先
  • p和q没有父子关系。

如果设p和q的最近公共祖先为x。如果x是p和q的公共祖先(不一定是最近的),应该会满足如下条件:

  • x == p,且x的左子树或右子树包含结点q
  • x== q,且x的左子树或右子树包含结点p
  • x的左子树包含结点q,且右子树包含结点p或相反。

考虑采用后续遍历来确定最近公共祖先。

  • 当遍历到结点p(或q)时,递归向上返回说明已经找到了结点p(或q)
  • 当遍历到结点q(或p)时,观察其左右子树的返回结果是否说明包含结点p或(q)
    • 如果是,则q(或p)就是最终结果
    • 否则继续逐层向上返回,直到某个结点的左右子树返回结果都说明了包含p或q
  • 这样的算法结果就是最近公共祖先,因为是左右子树同一次返回包含p或q就确定了结果
class Solution {
      boolean find = false;
      public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null)
            return null;
        TreeNode left = lowestCommonAncestor(root.left,p,q);
        if(find)
            return left;
        TreeNode right = lowestCommonAncestor(root.right,p,q);
        if(find)
            return right;
        if((left == p || root == p) && (right == q || root == q)  || (root == q || left == q) && (root == p || right == p))
        {
            find  =  true;
            return root;
        }
        if(root == p || left == p || right == p)
            return p;
        if(root == q || left == q || right == q)
            return q;
        return null;
      }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值