刷题分享:腾讯精选练习 50 题 Day15

题目:236. 二叉树的最近公共祖先

来源:力扣(LeetCode)https://leetcode-cn.com/problems/kth-smallest-element-in-a-bst/

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

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3

解题思路

【递归】【深度优先】
递归判断该节点是否为最近公共祖先。
判断条件比较复杂:

是否为公共祖先 = 左右子树都有该值||((根节点有其中之一值)&&(左右子树其中有一个有该值))

执行代码

class Solution {
    TreeNode node = null;
     public boolean dfs(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null) return false;
        boolean lch = dfs(root.left,p,q);
        boolean rch = dfs(root.right,p,q);
        //左右子树都有该值||((根节点有其中之一值)&&(左右子树其中有一个有该值))
        if((lch&&rch)||((root.val==p.val||root.val ==q.val)&&(lch||rch))){
            node = root;
            return true;
        }
        return (root.val == p.val||root.val == q.val)||lch||rch;
    }
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null) return null;
        dfs(root,p,q);
        return node;
    }
}

复杂度

时间复杂度:O( n )
空间复杂度:O( n )

题目:235. 二叉搜索树的最近公共祖先

来源:力扣(LeetCode) https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/

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

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
输出: 6 
解释: 节点 2 和节点 8 的最近公共祖先是 6

解题思路

本题是上题的简化版,当两个节点值:

  1. 都小于当前节点值时,遍历左子树
  2. 都大于当前节点值时,遍历右子树
  3. 其余情况(在当前节点两边、都等于该节点、一个等于一个不等于时),为该节点

执行代码

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        TreeNode ancestor = root;
        while (true) {
            //都小于当前节点值时,遍历左子树
            if (p.val < ancestor.val && q.val < ancestor.val) {         
                ancestor = ancestor.left;
            //都大于当前节点值时,遍历右子树
            } else if (p.val > ancestor.val && q.val > ancestor.val) {  
                ancestor = ancestor.right;
            //在当前节点两边、都等于该节点、一个等于一个不等于时,为该节点
            } else {  
                break;
            }
        }
        return ancestor;
    }
}

复杂度

时间复杂度:O( n )
空间复杂度:O( 1 )

题目:231. 2的幂

来源:力扣(LeetCode) https://leetcode-cn.com/problems/power-of-two/

【简单】给定一个整数,编写一个函数来判断它是否是 2 的幂次方。

输入: 1
输出: true
解释: 20 = 1

解题思路

找最右边是否有1,通过与x-1相与,如果结果不为0,则不为2的幂.
(x & (x - 1)) == 0
在这里插入图片描述

执行代码

class Solution {
  public boolean isPowerOfTwo(int n) {
    if (n == 0) return false;
    long x = (long) n;
    return (x & (x - 1)) == 0;
  }
}

复杂度

时间复杂度:O( 1 )
空间复杂度:O( 1 )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值