当前位置: 首页 > news >正文

2025年- G32-Lc106-133. 克隆图--java版(很抽象,没有很能理解)

1.题目描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.思路
思路一:
在这里插入图片描述
方法 1:BFS(广度优先搜索 + 队列)

方法 2:DFS(深度优先搜索 + 递归)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
例子2:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
例子3:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.代码实现
方法一:深度优先队列+递归

class Solution {

        private Map<Node, Node> m = new HashMap<>();//用于存储节点到克隆节点的映射,避免重复创建节点

        public Node cloneGraph(Node node) 
        {
            if (node == null)
                return null;
            if (m.containsKey(node))
                return m.get(node);//如果已经克隆,则返回该点
            //克隆当前节点
            Node clone = new Node(node.val, new ArrayList<>());
            m.put(node, clone);

            //递归克隆所有邻居
            for (Node neighbor : node.neighbors) {
                clone.neighbors.add(cloneGraph(neighbor));
            }
            return clone;

        }
}

方法二:深度优先队列+递归(带测试方法)

import java.util.*;

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 Solution10 {


        private Map<Node, Node> m = new HashMap<>();//用于存储节点到克隆节点的映射,避免重复创建节点

        public Node cloneGraph(Node node) {
            if (node == null)
                return null;
            if (m.containsKey(node))
                return m.get(node);//如果已经克隆,则返回该点
            //克隆当前节点
            Node clone = new Node(node.val, new ArrayList<>());
            m.put(node, clone);

            //递归克隆所有邻居
            for (Node neighbor : node.neighbors) {
                clone.neighbors.add(cloneGraph(neighbor));
            }
            return clone;

        }

        // 测试方法
        public static void main(String[] args) {
            // 创建测试图
            Node node1 = new Node(1);
            Node node2 = new Node(2);
            Node node3 = new Node(3);
            Node node4 = new Node(4);

            node1.neighbors.add(node2);
            node1.neighbors.add(node3);
            node2.neighbors.add(node1);
            node2.neighbors.add(node4);
            node3.neighbors.add(node1);
            node3.neighbors.add(node4);
            node4.neighbors.add(node2);
            node4.neighbors.add(node3);

            Solution10 solution = new Solution10();
            Node clonedGraph = solution.cloneGraph(node1);

            // 打印克隆结果
            System.out.println("克隆图的邻接表:");
            printGraph(clonedGraph, new HashSet<>());
        }

        // 辅助方法:打印图的邻接表
        private static void printGraph(Node node, Set<Integer> visited) {
            if (node == null || visited.contains(node.val)) return;
            visited.add(node.val);
            System.out.print("Node " + node.val + ": [");
            for (Node neighbor : node.neighbors) {
                System.out.print(neighbor.val + " ");
            }
            System.out.println("]");
            for (Node neighbor : node.neighbors) {
                printGraph(neighbor, visited);
            }
        }

    }

方法三:广度优先遍历+队列

import java.util.*;

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

        Map<Node, Node> map = new HashMap<>();
        Queue<Node> queue = new LinkedList<>();

        // 克隆起始节点并入队
        Node clone = new Node(node.val, new ArrayList<>());
        map.put(node, clone);
        queue.offer(node);

        while (!queue.isEmpty()) {
            Node cur = queue.poll();  // 取出队首节点

            for (Node neighbor : cur.neighbors) {
                if (!map.containsKey(neighbor)) { // 还未克隆
                    map.put(neighbor, new Node(neighbor.val, new ArrayList<>()));
                    queue.offer(neighbor);
                }
                // 连接克隆的邻居
                map.get(cur).neighbors.add(map.get(neighbor));
            }
        }
        return clone;
    }
}

相关文章:

  • Linux SSH远程登录
  • HCIA-Datacom高阶:基础的单区域 OSPF 与多区域 OSPF的配置
  • 关于IP免实名的那些事
  • 语音机器人与智能体结合
  • SpringAI与JBoltAI深度对比:从工具集到企业级AI开发范式的跃迁
  • (一)初始化窗口
  • 记录Jmeter 利用BeanShell 脚本解析JSON字符串
  • MAC安装docker 后提示com.docker.vmnetd”将对您的电脑造成伤害
  • MySQL 语句解析json字符串
  • 基于SpringBoot的“交通旅游订票系统”的设计与实现(源码+数据库+文档+PPT)
  • 【笔记】在windows使用docker管理mysql版本
  • JS—异步编程:3分钟掌握异步编程
  • cordova android12+升级一些配置注意事项
  • 3. 轴指令(omron 机器自动化控制器)——>MC_CamOut
  • 【Mac】npm error Error: EACCES: permission denied, mkdir‘/Users/...
  • 从零到一:ESP32与豆包大模型的RTC连续对话实现指南
  • 【Git 暂存操作指南2】
  • 网盘解析工具1.3.0,修改了一些bug,建议更新到此版本
  • 发票管理自动化-发票查验接口让财务告别繁琐的核验流程
  • Android面试总结之Glide源码级理解
  • 水豚出逃40天至今未归,江苏扬州一动物园发悬赏公告
  • 道指跌逾100点,特斯拉涨近5%
  • 上海“电子支付费率成本为0”背后:金融服务不仅“快”和“省”,更有“稳”和“准”
  • 洲际酒店:今年第一季度全球酒店平均客房收入同比增长3.3%
  • 纽约大学朗格尼医学中心的转型带来哪些启示?
  • 一热就出汗 VS 热死都不出汗的人,哪个更健康?