您的位置:首页 > 其它

Lowest Common Ancestor of a Binary Search Tree

2015-07-17 23:44 330 查看

题目235:Lowest Common Ancestor of a Binary Search Tree

题目描述:

求二叉搜索树的最低公共祖先。

1.递归解法

思路1:

参考[1]:

二叉搜索树,左子树的关键字都小于父结点,右子树的关键字都大于父结点。

所以如果是两个结点n1、n2的公共祖先,则公共祖先的关键字的值一定是n1 < n < n2(n1和n2也可能等于其中任意一个),所以只要从根开始递归的遍历,如果当前结点的关键字大于n1和n2,则LCA在当前结点的左子树;如果当前结点的关键字小于n1和n2,则LCA在当前结点的右子树;如果当前结点的关键字大于n1,小于n2,则返回当前结点。

/**
* 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 == 0)
return root;
if (root->val > p->val && root->val > q->val)
return lowestCommonAncestor(root->left, p, q);
if (root->val < p->val && root->val < q->val)
return lowestCommonAncestor(root->right, p, q);
return root;
}
};


递归解法的时间复杂度是O(h),h是二叉树的高度,需要额外的O(h)空间复杂度因为递归调用的函数栈。我们可以使用迭代的解法,来避免额外的空间。

2.非递归解法

思路2:

同是思路1,只是改为非递归,比如思路1是在左子树遍历查找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:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
while (root) {
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
break;
}
return root;
}
};


参考:

[1] http://www.geeksforgeeks.org/lowest-common-ancestor-in-a-binary-search-tree/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LCA binary tree search