一天一道LeetCode
本系列文章已全部上传至我的github,地址:ZeeCoder‘s Github
欢迎大家关注我的新浪微博,我的新浪微博
欢迎转载,转载请注明出处
(一)题目
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).”
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:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(p==NULL||q==NULL) return NULL;
stack<TreeNode*> st;
st.push(root);
TreeNode* max = p->val>q->val?p:q;//这里要找到给定两个节点中值较大的
TreeNode* min = p->val>q->val?q:p;//找到较小的
while(!st.empty()){
TreeNode* tmp = st.top();
st.pop();
if(tmp->val>=min->val&&tmp->val<=max->val) return tmp;//如果在范围内,代表找到了直接返回
else if(tmp->left!=NULL&&tmp->val<min->val) st.push(tmp->right);//如果在范围的右边,就继续往右子树找
else if(tmp->right!=NULL&&tmp->val>max->val) st.push(tmp->left);//如果在范围的左边,就继续往左子树找
else return NULL;//都不是就直接返回NULL
}
return NULL;
}
};