题目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/