您的位置:首页 > 其它

[LeetCode] Lowest Common Ancestor of a Binary Search Tree

2015-07-11 17:27 274 查看
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 v and w as the lowest node in T that has both v and w as descendants (where we allow a 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.

经典问题!

方法一:找到两个节点的路径,然后根据路径找LCA。

/**
* 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:
void getPath(TreeNode *root, TreeNode *p, vector<TreeNode*> &path) {
TreeNode *tmp = root;
while (tmp != p) {
path.push_back(tmp);
if (tmp->val > p->val) tmp = tmp->left;
else tmp = tmp->right;
}
path.push_back(p);
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
vector<TreeNode*> path1, path2;
getPath(root, p, path1);
getPath(root, q, path2);
TreeNode *res = root;
int idx = 0;
while (idx < path1.size() && idx < path2.size()) {
if (path1[idx] != path2[idx]) break;
else res = path1[idx++];
}
return res;
}
};


方法二:根据BST的性质,两个节点a,b的公共袓先c一定满足a <= c <= b 或者 a >= c >= b。

/**
* 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) {
TreeNode *cur = root;
while (cur != NULL) {
if (cur->val > p->val && cur->val > q->val) cur = cur->left;
else if (cur->val < p->val && cur->val < q->val) cur = cur->right;
else return cur;
}
return cur;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: