【leetcode 133. 克隆图】解题报告

方法一:dfs(递归)

    map<Node*,Node*> dict;
    Node* clone(Node* node)
    {
        if (!node) return node;
        if (dict.count(node)) return dict[node];
        dict[node]=new Node(node->val,vector<Node*>{});  // 这里不能写clone(node),会导致死循环,记住,在new的时候千万不要再递归,递归最低层一定有一个明确结果,所以要把截止条件写清楚
        for(auto it:node->neighbors)
            dict[node]->neighbors.push_back(clone(it));
        return dict[node];
    }
    Node* cloneGraph(Node* node) {
        return clone(node);
    }

方法二:dfs(非递归)

    map<Node*,Node*> dict;
    Node* cloneGraph(Node* node) 
    {
        stack<Node*> S;
        S.push(node);
        while (!S.empty())
        {
            Node *p = S.top();
            S.pop();
            if (!dict.count(p))  // 从栈中出来的都是没有进行访问过的点
                dict[p]=new Node(p->val,vector<Node*>{});
            for (auto it:p->neighbors)
            {
                if (!dict.count(it))  // 判断是否已经访问过该点
                {
                    dict[it]=new Node(it->val,vector<Node*>{});
                    S.push(it);
                }
                dict[p]->neighbors.push_back(dict[it]);  // 将新点的拷贝放入neighbors中
            }
        }
        return dict[node];
    }

 

posted @ 2019-04-30 19:24  byjz  阅读(184)  评论(0编辑  收藏  举报