class Solution:
def lowestCommonAncestor(self, root: ‘TreeNode’, p: ‘TreeNode’, q: ‘TreeNode’) -> ‘TreeNode’:
res = root
while True:
if p.val < res.val and q.val < res.val:
res = res.left
elif p.val > res.val and q.val > res.val:
res = res.right
else:
break
return res
利用二叉搜索树的特性
o n 空间 o 1
共以下 24 个回答
思路:判断root与给定p,q的值,如果root>p,q, 则递归判断root.left与p,q的大小关系;如果root<p,q, 则递归判断root.right 与 p,q的关系,否则root节点即p,q的最近公共节点。
java
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
while(root != null){
if(root.val < p.val && root.val < q.val)
root = root.right;
else if(root.val > p.val && root.val > q.val)
root = root.left;
else break;
}
return root;
}
}
提交
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
while(root){
if(p->val < root->val && q->val< root->val)
{
root = root->left;
}
else if(p->val > root->val && q->val >root->val)
{
root = root->right;
}
else{
return root;
}
}
return NULL;
}
};
迭代,时间复杂度O(n),空间复杂度O(1)
时间复杂度On,空间复杂度O1
时间复杂度:最差为 O(n),平均为 logn
空间复杂度:最差为 O(n),平均为 logn
day10第二题
第三次打卡BST
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
while(root!=null){
if(root.val <p.val &&root.val<q.val)
root=root.right;
else if(root.val >p.val &&root.val>q.val)
root=root.left;
else break;
}
return root;
}
}
思路:
若pq都在root的一侧 则往这一侧去找他们的公共祖先,若在两侧 则当前节点就是他们的公共祖先
时间复杂度O(n),空间复杂度O(n)
时间复杂度O(n)
空间复杂度O(1)
其实我一开始想到的是中序遍历,然后看到题解提示的数值关系才想起来分类讨论
“`C++
class Solution {
public:
//根据数值关系有四种
//p和q均小于根节点
//p和q均大于根节点
//p和q有一个等于根节点(找到答案)
//p和q一个大于根节点一个小于根节点(找到答案)
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == nullptr)
{
return nullptr;
}
//递归验证数值关系
TreeNode* ans = root;
while(1)
{
//p、q均小于根节点,此时左移根节点
if(p->val < ans->val && q->val < ans->val )
{
ans = ans->left;
}
else if(p->val > ans->val && q->val > ans->val )
{
ans = ans->right;
}
else
{
break;
}
}
return ans;
}
};
“`
打卡
https://leetcode.cn/problems/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian-lcof/solutions/2681873/er-cha-sou-suo-shu-de-zui-jin-gong-gong-o2c0e
打卡
Definition for a binary tree node.
class TreeNode:
def init(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def lowestCommonAncestor(self, root: ‘TreeNode’, p: ‘TreeNode’, q: ‘TreeNode’) -> ‘TreeNode’:
res = root
while True:
if p.val < res.val and q.val < res.val:
res = res.left
elif p.val > res.val and q.val > res.val:
res = res.right
else:
break
return res
利用二叉搜索树的特性
o n 空间 o 1
使用两次遍历
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(p.val < root.val && q.val < root.val)
return lowestCommonAncestor(root.left,p,q);
else if(p.val > root.val && q.val > root.val)
return lowestCommonAncestor(root.right,p,q);
else
return root;
}
//时间复杂度On
//空间复杂度On
//迭代
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(!root) return nullptr;
if((root->val >= p->val && root->val <= q->val) || (root->val <= p->val && root->val >= q->val))
return root;
if(root->val >= p->val && root->val >= q->val)
return lowestCommonAncestor(root->left, p, q);
else
return lowestCommonAncestor(root->right, p, q);
}
};
时间复杂度O(n),空间复杂度O(logn)
时空复杂度:logn
“`java
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
while(root!=null){
if(root.val > p.val && root.val > q.val){
root = root.left;
}else if(root.val < p.val && root.val < q.val){ root = root.right; }else{ return root; } } return null; } } ``` 利用二叉搜索树的性质
时空复杂度O(N)
时间复杂度:O(n)
空间复杂度;O(1)