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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章