【LeetCode】求1+2+…+n&&二叉搜索树的最近公共祖先&&二叉树的最近公共祖先

45.求1+2+…+n

题目:

1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

题解:
  • 使用&&巧妙的将n > 1作为递归结束的条件;
 public int sumNums(int n) {
        boolean x = n > 1 && (n += sumNums(n-1)) > 0;
        return n;
    }

46.二叉搜索树的最近公共祖先

题目:

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

题解:
  • 注意审题!这是一个 二叉搜索树
  • 如果p和q的值都大于root的值,则公共祖先是root.right;
  • 如果p和q的值都小于root的值,则公共祖先是root.left;
  • 如果二者的值有大于有小于root,则公共节点就是root;
  • 可结合具体的例子进行理解。
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        while (root != null){
            if (root.val < p.val && root.val < q.val)
                root = root.right;
            if (root.val > p.val && root.val > q.val)
                root = root.left;
            else break;
        }
        return root;
    }

47.二叉树的最近公共祖先

题目:

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

题解:

注意审题!!这是一个 二叉树

  • 递归结束的条件
    • root为null || root等于p || root等于q 则返回root;
  • 递推关系
    • 递归调用lowestCommonAncestor函数,记录左右子树的返回节点left和right
    • 哪边不为null,就说明哪边存在p或者q,因此
      • 如果left和right均不为null,则说明p和q一边一个,则公共祖先为二者的父类root;
      • 如果left为null,则说明p和q都在右侧,返回右侧节点;
      • 如果right为null,则说明p和q都在左侧,返回左侧节点;
      • 如果二者均为null,返回root或者null均可。
 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root == p || root == q || root == null) return root;
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        if (left == null && right != null) return root;
        else if (left == null) return right;
        else if (right == null) return left;
        return root;
    }

马龙实现世乒赛男单三连冠、奥运会男单两连冠、全运会男单两连冠,你可曾知道他的郁郁不得志,曾经连续六年三届世乒赛被王皓挡在决赛之外,而同年龄的张继科早就功成名就。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值