Leetcode235
1.问题描述
2.解决方案
解法一:递归
以后但凡遇见二叉搜索树就要想递归绝对不是回溯递归,因为天生有序,但是这道题应该如何运用呢,我们自然而然的应该剖析最近公共祖先和两个节点的大小关系,然后意识到是区间内的关系,那么递归顺序就出来了!
1.如果大于两个结点就去左子树找
2.如果小于两个结点就去右子树找
3.除了这两种情况那不就是在区间内了嘛,直接返回当前结点root
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
//百分之百不会从这走,因为题目说p,q一定存在
if(root== nullptr) return nullptr;
if(root->val>p->val&&root->val>q->val) return lowestCommonAncestor(root->left,p,q);
if(root->val<p->val&&root->val<q->val) return lowestCommonAncestor(root->right,p,q);
//不大于不小于那就说明 root->val在[p->val,q->val]范围里面了
return root;
}
};
解法二:迭代
和递归的分析一摸一样,就是迭代一下,这也是二叉搜索树迭代的优势不需要回溯!
class Solution1 {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
while(root!= nullptr){
if(root->val>p->val&&root->val>q->val) {root=root->left; continue;}
if(root->val<p->val&&root->val<q->val) {root=root->right; continue;}
return root;
}
//百分之百不会从这走,因为题目说p,q一定存在
return nullptr;
}
};