二叉搜索树的最近公共祖先——力扣235

题目描述
二叉搜索树的最近公共祖先——力扣235_第1张图片

法一)两次遍历
解题思路
二叉搜索树的最近公共祖先——力扣235_第2张图片
复杂度分析
二叉搜索树的最近公共祖先——力扣235_第3张图片
代码如下

class Solution {
public:
    vector<TreeNode*> getPath(TreeNode* root, TreeNode* target) {
        vector<TreeNode*> path;
        TreeNode* node = root;
        while(node!=target) {
            path.push_back(node);
            if(target->val < node->val){
                node = node->left;
            } else {
                node = node->right;
            }
        }
        path.push_back(node);
        return path;
    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        vector<TreeNode*> path_p = getPath(root, p);
        vector<TreeNode*> path_q = getPath(root, q);
        TreeNode* ancestor;
        for (int i=0; i<path_p.size() && i<path_q.size(); ++i) {
            if(path_p[i] == path_q[i]){
                ancestor = path_p[i];
            } else {
                break;
            }
        }
        return ancestor;
    }
};

法二)一次遍历
解题思路
二叉搜索树的最近公共祖先——力扣235_第4张图片
复杂度分析
在这里插入图片描述
代码如下

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;
    }
};

你可能感兴趣的:(算法刷题笔记,leetcode,算法,c++)