[Leetocde]Lowest Common Ancestor of a Binary Search Tree

来源:互联网 发布:软件测试工程师工资 编辑:程序博客网 时间:2024/04/30 14:50

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 v and w as the lowest node in T that has both v and w as descendants (where we allowa node to be a descendant of itself).”

        _______6______       /              \    ___2__          ___8__   /      \        /      \   0      _4       7       9         /  \         3   5

For example, the lowest common ancestor (LCA) of nodes 2 and 8 is 6. Another example is LCA of nodes 2 and 4 is 2, since a node can be a descendant of itself according to the LCA definition.

/** * 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:    /*algorithm     1)p and q is in separated child tree, root is their LCA     2)p or q is root, return root     3)recursive call lowestCommonAncestor     further thoughts:     1)p or q is not in the root tree, how about this?     2)how about to handle this if either of root,p,q is NULL     3)how about p and q is same node? return its parent, this seems reasonable    *///parentTreeNode* parent(TreeNode* root,TreeNode* p){   if(p == root)return NULL;    if(root->right == p ||       root->left == p)return root    parent(root->left,p);    parent(root->right,p);}    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {            //handle case 2 root,p,or q is null            if(!root || !p || !q)return NULL;            //handle 3 case            if(p == q)return parent(p);                     //handle 1 issue, p or q is not in the tree            TreeNode* first,*last;            first = root;            while(first->left)first = first->left;            last = root;            while(last->right)last = last->right;            if(first->val > p->val || first->val > q->val ||               last->val < p->val || last->val < q->val)//not in the tree               return NULL;            //just consider normal condition            if(root->val > p->val && root->val > q->val) //p and q in left child                return lowestCommonAncestor(root->left,p,q);            if(root->val < p->val && root->val < q->val) //p and q in right                return lowestCommonAncestor(root->right,p,q);            //otherwise , p and q one is in left, one is on right            return root;    }}


0 0