235.Lowest Common Ancestor of a Binary Search Tree


给定一个二叉搜索树,以及2个节点p, q ,求这两个节点的最近公共祖先。

Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
Output: 6
Explanation: The LCA of nodes 2 and 8 is 6.

Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
Output: 2
Explanation: The LCA of nodes 2 and 4 is 2, since a node can be a descendant of itself according to the LCA definition.

思路:
一、因为是二叉搜索树,所以中序遍历是已经排好序的如果p, q的值都比根节点小,则最近祖先节点在根节点左边,反之,在根节点右边;如果其中一个比根节点小,另一个比根节点大,则根节点就是最近祖先。对于其中一个节点的值等于根节点,则根节点也是最近祖先。题目说了一定存在最近祖先,所以不用考虑节点为空、不存在的情况。

TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
    if (root->val == p->val || root->val == q->val) return root;
    if (root->val > p->val && root->val < q->val) return root; //  p < root < q
    if (root->val > q->val && root->val < p->val) return root; //  q < root < p
    if (root->val > p->val && root->val > q->val) return lowestCommonAncestor(root->left, p, q);
    return lowestCommonAncestor(root->right, p, q);
}

 

二、如果不考虑二叉搜索树,将二叉树当作无序的普通二叉树。
则,当前节点与其中任意一个节点相等时,返回当前节点。
当前节点的左子树搜索有返回结果,且右子树搜索也有返回结果,则当前节点就是最近公共祖先,返回当前节点。
当前节点的一边子树搜索有结果,而另一边返回为null,返回有结果的子树上返回的结果,所以,需要一个变量来保存子树搜索的结果
如果都为左右子树搜索结果都为null,返回null.

TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
    if (!root) return NULL;
    if (root == p || root == q) return root;
    TreeNode* left_res = lowestCommonAncestor(root->left, p, q);
    TreeNode* right_res = lowestCommonAncestor(root->right, p, q);
    if (left_res && right_res) return root;
    return left_res ? left_res : right_res;
}

 

Java 版:

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(p.val > q.val){
            TreeNode tmp = p;
            p = q;
            q = tmp;
        }
        if(p.val <= root.val && q.val >= root.val) return root;
        if(p.val < root.val && q.val < root.val) return lowestCommonAncestor(root.left, p,q);
        return lowestCommonAncestor(root.right, p,q);
    }
}

 

posted @ 2020-05-12 20:39  星海寻梦233  阅读(114)  评论(0编辑  收藏  举报