Sword68-I——二叉搜索树的最近公共祖先

Sword68-I——二叉搜索树的最近公共祖先

方法1——迭代

  • 思路:利用好二叉搜索树的性质,即左子树元素均比根节点小,右子树元素均比根节点大,这就可以找出此次终止条件
    • 从根节点进行比较,分为以下几种情况
      • 当前节点值比p、q都要大,则p、q存在于当前节点的左子树中
      • 当前节点值比p、q都要小,则p、q存在于当前节点的右子树中
      • 当前节点值比p、q中一方要大,比另一方要小;或者p、q自身为当前节点,即证明当前节点为p、q的最近公共祖先
  • 特殊情况与临界分析:无
  • 终止条件:无
  • 步骤:
    • while循环
      • 循环条件:当前节点非空
      • 当前节点值比p、q都要大,向当前节点左子树进行查找
      • 当前节点值比p、q都要小,向当前节点右子树进行查找
      • 当前节点值比p、q中一方要大,比另一方要小;或者p、q自身为当前节点,即证明当前节点为p、q的最近公共祖先
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        // while循环
        while (root != null) {
            // 当前节点值大于p、q
            if (root.val > p.val && root.val > q.val) {
                // 向其左子树查找
                root = root.left;
            }
            // 当前节点值小于p、q
            else if (root.val < p.val && root.val < q.val) {
                // 向其右子树查找
                root = root.right;
            }
            // 其他情况,即退出循环
            else {
                break;
            }
        }
        // 返回当前节点
        return root;
    }

方法1——迭代

方法2——递归

  • 思路:原理同上方法
  • 特殊情况与临界分析:无
  • 终止条件:无
  • 步骤:
    • 当前节点值比p、q都要大,向当前节点左子树递归进行查找
    • 当前节点值比p、q都要小,向当前节点右子树递归进行查找
    • 当前节点值比p、q中一方要大,比另一方要小;或者p、q自身为当前节点,即证明当前节点为p、q的最近公共祖先;即其他情况,直接返回当前节点,即为递归终止条件
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        // 当前节点值大于p、q
        if (root.val > p.val && root.val > q.val) {
            return lowestCommonAncestor(root.left, p, q);
        }
        // 当前节点值小于p、q
        else if (root.val < p.val && root.val < q.val) {
            return lowestCommonAncestor(root.right, p, q);
        }
        // 其他情况,直接返回当前节点,即递归终止条件
        return root;
    }

方法2——递归

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值