0235-二叉搜索树的最近公共祖先

二叉搜索树的最近公共祖先

方案一


由于二叉搜索树的特点是左<根<右,所以根节点的值一直都是中间值,大于左子树的所有节点值,小于右子树的所有节点值,那么我们可以做如下的判断,如果根节点的值大于p和q之间的较大值,说明p和q都在左子树中,那么此时我们就进入根节点的左子节点继续递归,如果根节点小于p和q之间的较小值,说明p和q都在右子树中,那么此时我们就进入根节点的右子节点继续递归,如果都不是,则说明当前根节点就是最小共同父节点,直接返回即可

C++-源代码


#include 
//#include 
//#include 

using namespace std;

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 root;
        }
        
        if (root->val > max(p->val, q->val)) {
            
            return lowestCommonAncestor(root->left, p, q);
        }
        else if (root->val < min(p->val, q->val)) {
            
            return lowestCommonAncestor(root->right, p, q);
        }
        else {
            
            return root;
        }
    }
};

方案二


如果当前结点不为空,且既不是p也不是q,那么根据上面的分析,p和q的位置就有三种情况,p和q要么分别位于左右子树中,要么同时位于左子树,或者同时位于右子树。我们需要优化的情况就是当p和q同时为于左子树或右子树中,而且返回的结点并不是p或q,那么就是p和q的最小父结点了,已经求出来了,就不用再对右结点调用递归函数了

C++-源代码


class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        
        while (true) {
            
            if (root->val > max(p->val, q->val)) {
                
                root = root->left;
            }
            else if (root->val < min(p->val, q->val)) {
                
                root = root->right;
            }
            else {
                
                return root;
            }
        }
    }
};

参考Grandyang

你可能感兴趣的:(0235-二叉搜索树的最近公共祖先)