1. 程式人生 > >[LeetCode] 235. Lowest Common Ancestor of a Binary Search Tree

[LeetCode] 235. Lowest Common Ancestor of a Binary Search Tree

Lowest Common Ancestor of a Binary Search Tree

Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.
According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes p and q as the lowest node in T that has both p and q as descendants (where we allow a node to be a descendant of itself).”
Given binary search tree: root = [6,2,8,0,4,7,9,null,null,3,5]
這裡寫圖片描述


Example 1:

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.

Example 2:

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.

Note:
All of the nodes’ values will be unique.
p and q are different and both values will exist in the BST.

解析

這道題我們可以用遞迴來求解,我們首先來看題目中給的例子,由於二叉搜尋樹的特點是左<根<右,所以根節點的值一直都是中間值,大於左子樹的所有節點值,小於右子樹的所有節點值,那麼我們可以做如下的判斷,如果根節點的值大於p和q之間的較大值,說明p和q都在左子樹中,那麼此時我們就進入根節點的左子節點繼續遞迴,如果根節點小於p和q之間的較小值,說明p和q都在右子樹中,那麼此時我們就進入根節點的右子節點繼續遞迴,如果都不是,則說明當前根節點就是最小共同父節點,直接返回即可。

解法1:遞迴

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

解法2:非遞迴

當然,此題也有非遞迴的寫法,用個while迴圈來代替遞迴呼叫即可,然後不停的更新當前的根節點,也能實現同樣的效果。

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

參考

http://www.cnblogs.com/grandyang/p/4640572.html