LeetCode 235. 二叉搜索樹的最近公共祖先 (利用二叉搜索樹的有序的性質、遞歸||迭代)

二叉搜索樹的最近公共祖先
BST的性質(定義):
①左子樹的節點的值都比根節點值小。
②右子樹的節點的值都比根節點值大。
③左子樹、右子樹都是BST。
所以,
假如p、q的值都比根節點的值要小,說明這個根節點還不是最近的,它的左子樹的根可能更近。
假如p、q的值都比根節點的值要大,說明這個它的右子樹的根節點可能更近。
如果一個大一個小,說明此時根節點已經是最近公共祖先了。
當然此題也可以按照一般的二叉樹做,繁一點

遞歸實現:

/**
 * 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) {
        int rv = root->val;
        int pv = p->val;
        int qv = q->val;
        if(pv>rv && qv>rv){
            return lowestCommonAncestor(root->right,p,q);
        }else if(pv<rv && qv<rv){
            return lowestCommonAncestor(root->left,p,q);
        }else{
            return root;
        }
    }
};

迭代實現:

/**
 * 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) {
        int pv = p->val;
        int qv = q->val;
        while(root){
            int rv = root->val;
            if(pv>rv && qv>rv){
                root = root->right;
            }else if(pv<rv && qv<rv){
                root = root->left;
            }else{
                return root;
            }
        }
        return nullptr;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章