腾讯精选练习 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。
解题思路
本题是上题的简化版,当两个节点值:
- 都小于当前节点值时,遍历左子树
- 都大于当前节点值时,遍历右子树
- 其余情况(在当前节点两边、都等于该节点、一个等于一个不等于时),为该节点
执行代码
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 )