LeetCode 236. 二叉树的最近公共祖先(LCA、向上染色法)

二叉树的最近公共祖先
求LCA的朴素做法:向上染色。
先让一个节点不断向上,并标记父节点。
然后让另一个节点也向上寻找,然后第一次遇到的已经染色节点就是LCA。
具体做法:
先BFS求出每个节点的父节点。用unordered_map<TreeNode*,TreeNode*>记录,如果要数字,直接用int fa[];
然后用unordered_set<TreeNode*>记录染色的节点。
如果是数字,可以用int vis[]
时间复杂度:
O(n)O(n)
加以优化,就得到了树上倍增求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:
    unordered_map<TreeNode*,TreeNode*> fa;
    unordered_set<TreeNode*> vis;
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        queue<TreeNode*> que;
        if(root) que.push(root);
        fa[root] = nullptr;
        while(que.size()){
            TreeNode* par = que.front();
            que.pop();
            if(par->left){
                que.push(par->left);
                fa[par->left] = par;
            }
            if(par->right){
                que.push(par->right);
                fa[par->right] = par;
            }
        }
        while(p){
            vis.insert(p);
            p = fa[p];
        }
        while(q){
            if(vis.count(q)){
                return q;
            }
            q = fa[q];
        }
        return nullptr;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章