Leetcode图专题

24 篇文章 0 订阅
5 篇文章 0 订阅

要明白的基础知识

node1=UndirectedGraphNode(1)
node2=UndirectedGraphNode(2)
nodeMap={}
nodeMap[node1]="hello"
nodeMap[node2]="world"
#这样是合法的,打印nodeMap看看
nodeMap
Out[8]: 
{<__main__.UndirectedGraphNode at 0x18215e262e8>: 'world',
 <__main__.UndirectedGraphNode at 0x18215e26320>: 'hello'}

clone graph

考察最基本的图的遍历,深度遍历和宽度遍历
题目如下:
Given the head of a graph, return a deep copy (clone) of the graph. Each node in the graph contains a label (int) and a list (List[UndirectedGraphNode]) of its neighbors. There is an edge between the given node and each of the nodes in its neighbors.

OJ’s undirected graph serialization (so you can understand error output):
Nodes are labeled uniquely.

We use # as a separator for each node, and , as a separator for node label and each neighbor of the node.

As an example, consider the serialized graph {0,1,2#1,2#2,2}.

The graph has a total of three nodes, and therefore contains three parts as separated by #.

First node is labeled as 0. Connect node 0 to both nodes 1 and 2.
Second node is labeled as 1. Connect node 1 to node 2.
Third node is labeled as 2. Connect node 2 to node 2 (itself), thus forming a self-cycle.

Visually, the graph looks like the following:

   1
  / \
 /   \
0 --- 2
     / \
     \_/

Note: The information about the tree serialization is only meant so that you can understand error output if you get a wrong answer. You don’t need to understand the serialization to solve the problem.
DFS解法:

#深度优先遍历解法
# Definition for a undirected graph node
# class UndirectedGraphNode:
#     def __init__(self, x):
#         self.label = x
#         self.neighbors = []

class Solution:
    # @param node, a undirected graph node
    # @return a undirected graph node
    def cloneGraph(self, node):
        if None == node: return None
        nodeMap = {}
        return self.cloneNode(node, nodeMap)

    def cloneNode(self, node, nodeMap):#注意理解这个函数的意思,就是clone一个node
        if None == node:
            return None
        #访问当前点,这里不是简单的print,而是复制,若已经复制,即这个node已经被创建,则返回副本
        if node in nodeMap.keys():#node
            return nodeMap[node]
        #若没有副本,则复制一份,同样处理其邻接点
        else:
            clone = UndirectedGraphNode(node.label)
            nodeMap[node] = clone
            #访问其邻居节点
            for neighbor in node.neighbors:
                clone.neighbors.append(self.cloneNode(neighbor, nodeMap))
        return clone

BFS遍历:广度优先遍历:

# Definition for a undirected graph node
# class UndirectedGraphNode:
#     def __init__(self, x):
#         self.label = x
#         self.neighbors = []

class Solution:
    # @param node, a undirected graph node
    # @return a undirected graph node
    # @BFS
    def cloneGraph(self, node):
        if node == None: return None
        queue = []; map = {}
        newhead = UndirectedGraphNode(node.label)
        queue.append(node)
        map[node] = newhead
        while queue:
            curr = queue.pop()
            for neighbor in curr.neighbors:
                if neighbor not in map:
                    copy = UndirectedGraphNode(neighbor.label)
                    map[curr].neighbors.append(copy)
                    map[neighbor] = copy
                    queue.append(neighbor)
                else:
                    # turn directed graph to undirected graph
                    map[curr].neighbors.append(map[neighbor])
        return newhead
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值