有向图深拷贝

无向图node结点

class Node {
    public int val;
    public List<Node> neighbors;
    
    public Node() {
        val = 0;
        neighbors = new ArrayList<Node>();
    }
    
    public Node(int _val) {
        val = _val;
        neighbors = new ArrayList<Node>();
    }
    
    public Node(int _val, ArrayList<Node> _neighbors) {
        val = _val;
        neighbors = _neighbors;
    }
}

方式一,深度优先遍历算法拷贝:

class Solution {
	//存储访问过的结点及其拷贝的结点
    private HashMap <Node, Node> visited = new HashMap <> ();
    
    public Node cloneGraph(Node node) {
        if (node == null) {
            return node;
        }

        // 如果该节点已经被访问过了,则直接从哈希表中取出对应的克隆节点返回
        if (visited.containsKey(node)) {
            return visited.get(node);
        }

        // 克隆节点,注意到为了深拷贝我们不会克隆它的邻居的列表
        Node cloneNode = new Node(node.val, new ArrayList());
        // 哈希表存储
        visited.put(node, cloneNode);

        // 遍历该节点的邻居并更新克隆节点的邻居列表
        for (Node neighbor: node.neighbors) {
            cloneNode.neighbors.add(cloneGraph(neighbor));
        }
        return cloneNode;
    }
}

方式二、广度优先遍历算法拷贝:

class Solution {
    public Node cloneGraph(Node node) {
        if (node == null) {
            return node;
        }

        HashMap<Node, Node> visited = new HashMap();

        // 将题目给定的节点添加到队列
        LinkedList<Node> queue = new LinkedList<Node> ();
        queue.add(node);
        // 克隆第一个节点并存储到哈希表中
        visited.put(node, new Node(node.val, new ArrayList()));

        // 广度优先搜索
        while (!queue.isEmpty()) {
            // 取出队列的头节点
            Node n = queue.remove();
            // 遍历该节点的邻居
            for (Node neighbor: n.neighbors) {
                if (!visited.containsKey(neighbor)) {
                    // 如果没有被访问过,就克隆并存储在哈希表中
                    visited.put(neighbor, new Node(neighbor.val, new ArrayList()));
                    // 将邻居节点加入队列中
                    queue.add(neighbor);
                }
                // 更新当前节点的邻居列表
                visited.get(n).neighbors.add(visited.get(neighbor));
            }
        }

        return visited.get(node);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用中的代码展示了一种在C#中实现拷贝的方法,通过序列化和反序列化来创建一个新的对象实体。在这个例子中,我们定义了一个Box类,并在该类中实现了DeepCopy方法来实现拷贝。在DeepCopy方法中,我们使用了BinaryFormatter来将对象序列化为流,并将流反序列化为一个新的对象返回。 对于C#中的无向拷贝,我们可以按照类似的方式进行实现。假设我们有一个Graph类来表示无向,其中包含了节点和边的信息。为了实现拷贝,我们可以在Graph类中实现一个DeepCopy方法,该方法会创建一个新的Graph对象,并将原始对象的属性值复制到新对象中。需要注意的是,如果Graph类中包含了其他引用类型的属性,我们也需要对这些属性进行拷贝。 下面是一个示例代码来展示如何在C#中实现无向拷贝: ```csharp using System; using System.Collections.Generic; class Node { public int Id { get; set; } public List<Node> Neighbors { get; set; } public Node DeepCopy() { Node newNode = new Node(); newNode.Id = this.Id; if (this.Neighbors != null) { newNode.Neighbors = new List<Node>(); foreach (var neighbor in this.Neighbors) { newNode.Neighbors.Add(neighbor.DeepCopy()); } } return newNode; } } class Graph { public List<Node> Nodes { get; set; } public Graph DeepCopy() { Graph newGraph = new Graph(); newGraph.Nodes = new List<Node>(); foreach (var node in this.Nodes) { newGraph.Nodes.Add(node.DeepCopy()); } return newGraph; } } class Program { static void Main(string[] args) { // 创建一个无向对象 Graph graph = new Graph(); graph.Nodes = new List<Node>(); Node node1 = new Node(); node1.Id = 1; Node node2 = new Node(); node2.Id = 2; node1.Neighbors = new List<Node>() { node2 }; node2.Neighbors = new List<Node>() { node1 }; graph.Nodes.Add(node1); graph.Nodes.Add(node2); // 创建一个拷贝的无向对象 Graph deepCopyGraph = graph.DeepCopy(); // 验证拷贝是否成功 Console.WriteLine(deepCopyGraph.Nodes[0].Id); // 输出 1 Console.WriteLine(deepCopyGraph.Nodes[0].Neighbors[0].Id); // 输出 2 // 修改原始对象,验证拷贝是否独立于原对象 graph.Nodes[0].Id = 3; Console.WriteLine(deepCopyGraph.Nodes[0].Id); // 输出 1 // 提出几个相关问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值