题解 | #二叉搜索树的最近公共祖先#

二叉搜索树的最近公共祖先

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;
};
全部评论

相关推荐

喜欢走神的孤勇者练习时长两年半:爱华,信华,等华,黑华
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务