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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章