236. 二叉树的最近公共祖先

 

 unordered_set哈希集合确实好像速度慢,还是我自己的问题

一遍遍历找到p结点的所有祖先,然后再后序遍历q结点的祖先

查看代码
/**
 * 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) {
        unordered_set<TreeNode*>s;
        find_parent_p(s,root,p);
        TreeNode* temp = new TreeNode();
        find_parent_q(s,root,q,temp);
        return temp->left;
    }
    bool find_parent_p(unordered_set<TreeNode*>& s,TreeNode* root,TreeNode* p){
        if(root == NULL){
            return false;
        }
        if(root == p){
            s.insert(root);
            return true;
        }
        if(find_parent_p(s,root->left,p)||find_parent_p(s,root->right,p)){
            s.insert(root);
            return true;
        }
        else{
            return false;
        }
    }
    bool find_parent_q(unordered_set<TreeNode*>& s,TreeNode* root,TreeNode* q,TreeNode* temp){
        if(root == NULL){
            return false;
        }
        //cout<<root->val;
        if(root == q){
            if(s.count(root)!=0){
                temp->left= root;
                return false;
            }
            return true;
        }
        if(find_parent_q(s,root->left,q,temp)||find_parent_q(s,root->right,q,temp)){
            if(s.count(root)!=0){
                temp->left =root;
               // cout<<root->val;
                return false;
            }
          //  cout<<root->val;
            return true;
        }
        else
            return false;
    }
};
posted @ 2021-12-22 20:59  jozon  阅读(29)  评论(0)    收藏  举报