[Lc]面试题68_I二叉搜索树的最近公共祖先
Contents
题目
二叉树结构如下:
//Definition for a binary tree node.
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
题解
两个方法
这道题是236的子问题,多了二叉搜索树的限制。用236的方法也可以解决,但是就没有利用二叉搜索树的这个条件。
二叉搜索树有以下性质:
- 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
- 若任意节点的右子树不空,则右子树上所有节点的值均大于或等于它的根节点的值;
- 任意节点的左、右子树也分别为二叉查找树;
利用这些性质,有迭代和递归两个方法,只要找到一个数在p和q之间就可以,比较简单,看代码吧
1. 迭代法
- 时间复杂度 $O(N)$:其中N为二叉树节点数;每循环一轮排除一层,二叉搜索树的层数最小为logN(满二叉树),最大为N (退化为链表)。
- 空间复杂度 $O(1)$:使用常数大小的额外空间。
class Solution {//两个方法。1.迭代
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
while(root){
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 nullptr;
}
};
2. 递归法
- 时间复杂度 $O(N)$:其中N为二叉树节点数;每循环一轮排除一层,二叉搜索树的层数最小为logN(满二叉树),最大为N (退化为链表)。
- 空间复杂度 $O(N)$:递归层数和二叉树的深度有关。
class Solution {//两个方法。2.递归
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root->val < p->val && root->val < q->val){
return lowestCommonAncestor(root->right, p, q);
}else if(root->val > p->val && root->val > q->val){
return lowestCommonAncestor(root->left, p, q);
}
return root;
}
};
Author ChrisHRZ
LastMod 2020-07-03