《从头再来》剑指offer.68I 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

根据二叉搜索树的性质,如果左子树存在,则左子树所有节点的值都小于根结点。同样的,如果右子树存在,则右子树所有节点的值都大于根结点。那么我们就可以利用这个性质迭代的对节点进行查找,当当前节点不为空时,如果当前节点的值大于p的值,同时也大于q的值,则说明p、q位于当前节点的左子树,继续迭代的查找左子树;如果当前节点的值小于p的值,同时也小于q的值,则说明p、q位于当前节点的右子树,继续迭代的查找右子树。如果不满足这两个条件,则说明当前节点就是要找的节点。如果什么都没找到,则返回nullptr。

 

/**
 * 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) {
        //迭代
        if(root == nullptr) return nullptr;

        while(root != nullptr){
            if(root->val > p->val && root->val > q->val)    root = root->left;
            else if(root->val < p->val && root->val < q->val)    root = root->right;
            else return root;
        }
        return nullptr;
    }
};

《从头再来》

posted @ 2021-06-08 21:46  丶原来是枝知啊i  阅读(56)  评论(0)    收藏  举报