题解 | #二叉搜索树的最近公共祖先#
二叉搜索树的最近公共祖先
http://www.nowcoder.com/practice/d9820119321945f588ed6a26f0a6991f
解题思路
对于查找最近公共祖先,我们首先想法可以是对二叉树的每一个节点都进行递归,用两个变量来标记对应的值是否已经遍历,如果已经遍历,记为true,否则不变(默认为false)。当前根节点遍历结束后,我们判断两个变量,如果两个变量都为真,说明当前节点是给定值得祖先(但请注意,此祖先不一定是最近祖先!!!),因此,找到祖先后,我们用一个值来记录当前祖先的值,然后再继续遍历之后的节点,并把之前的变量重新置为false,如果后面变量全为真,则更新祖先值,直至遍历完所有节点,此时的祖先值一定就是最近祖先(因为我们是从根往下一个节点一个节点进行遍历的。)
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @param p int整型
* @param q int整型
* @return int整型
*/
int lowestCommonAncestor(TreeNode* root, int p, int q) {
// write code here
//层序遍历
queue<TreeNode*> tq;
tq.push(root);
int res;
while(!tq.empty()){
TreeNode *node = tq.front();
tq.pop();
if(node->left)
tq.push(node->left);
if(node->right)
tq.push(node->right);
//递归当前节点
temp1 = BSTSearch(node, p);
temp2 = BSTSearch(node, q);
if(temp1 && temp2)
res = node->val;
temp1 = false;
temp2 = false;
}
return res;
}
bool BSTSearch(TreeNode* root,int p){
if(!root)
return false;
//查找
while(root){
if(root->val > p)
root = root->left;
else if(root->val < p)
root = root->right;
else
return true;
}
return false;
}
private:
bool temp1 = false;
bool temp2 = false;
};