Sword68-II——二叉树的最近公共祖先

Sword68-II——二叉树的最近公共祖先

方法1——递归

  • 思路:此题是对上一题的演化,迭代方法肯定不再适用,因为此时无法判断左右子节点大小。因此使用的便是递归
    • 对于当前节点,将会有以下情况
      • 1、left与right均为空,此时p、q不存在于当前节点的左右子树中(当前节点为叶子节点),此时返回null
      • 2、left与right均非空,此时p、q存在于当前节点的左右子树中,且二者处于异侧,此时返回当前节点为最近公共祖先
      • 3、left与right其中一个为空,另一个非空,p、q中的一个或两个都存在一侧子树中,此时返回非空的一侧节点为最近公共祖先
    • 对于上述情况,只有找到当前节点为p或q节点才能返回非空,其他情况都将返回空,这才会导致第2种情况的断定
    • 综合上述情况进行简化
      • 当left为空,直接返回right(对于1,right为空,此时也返回空;对于3,right非空,此时返回非空一侧即为right)
      • 当left非空,判断右侧是否为空,为空返回left,非空返回当前节点(对于2,right非空,此时返回当前节点;对于3,此时返回非空一侧即为left)
  • 特殊情况与临界分析:无
  • 终止条件:无
  • 步骤:
    • 递归终止条件:当前节点越过叶子节点,当前节点为p、q节点中的一个,返回当前节点
    • 对左子树递归
    • 对右子树递归
    • 根据综合情况进行判断
      • left为空,返回right
      • left非空
        • right为空,返回left
        • right非空,返回当前节点root
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        // 终止条件:越过叶子节点、当前节点为p或q
        if (root == null || root.val == p.val || root.val == q.val) {
            return root;
        }
        // 对左子树进行递归
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        // 根据综合情况进行判断
        return left == null ? right : (right == null ? left : root);
    }

方法1——递归

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值