力扣labuladong——一刷day53

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • [一、力扣1485. 克隆含随机指针的二叉树](#一、力扣1485. 克隆含随机指针的二叉树)
  • [二、力扣1490. 克隆 N 叉树](#二、力扣1490. 克隆 N 叉树)
  • [三、力扣133. 克隆图](#三、力扣133. 克隆图)
  • [四、力扣138. 随机链表的复制](#四、力扣138. 随机链表的复制)

前言


复制带有随机指针的二叉树或者链表,或者图,先设置一个map作为映射,原节点与复制后节点的映射,然后正常的遍历返回节点,但需要注意的是,遍历顺序,先遍历其他节点,最后遍历随机节点,因为随机节点可能没有被创建,遍历其他节点时,创建复制节点,遍历随机节点时,查找映射关系返回

一、力扣1485. 克隆含随机指针的二叉树

java 复制代码
/**
 * Definition for Node.
 * public class Node {
 *     int val;
 *     Node left;
 *     Node right;
 *     Node random;
 *     Node() {}
 *     Node(int val) { this.val = val; }
 *     Node(int val, Node left, Node right, Node random) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *         this.random = random;
 *     }
 * }
 */

class Solution {
    HashMap<Node,NodeCopy> map = new HashMap<>();
    public NodeCopy copyRandomBinaryTree(Node root) {
        if(root == null){
            return null;
        }
        if(map.containsKey(root)){
            return map.get(root);
        }
        NodeCopy cur = new NodeCopy(root.val);
        map.put(root,cur);
        cur.left = copyRandomBinaryTree(root.left);
        cur.right = copyRandomBinaryTree(root.right);
        cur.random = copyRandomBinaryTree(root.random);
        return cur;
    }
}

二、力扣1490. 克隆 N 叉树

java 复制代码
/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> children;

    
    public Node() {
        children = new ArrayList<Node>();
    }
    
    public Node(int _val) {
        val = _val;
        children = new ArrayList<Node>();
    }
    
    public Node(int _val,ArrayList<Node> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
    public Node cloneTree(Node root) {
        if(root == null){
            return null;
        }
        Node cur = new Node(root.val);
        cur.children = new LinkedList<Node>();
        for(Node n : root.children){
            Node c = cloneTree(n);
            cur.children.add(c);
        }
        return cur;
    }
}

三、力扣133. 克隆图

java 复制代码
/*
// Definition for a 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 {
    HashSet<Node> visited = new HashSet<>();
    Map<Node,Node> originToClone = new HashMap<>();
    public Node cloneGraph(Node node) {
        traverse(node);
        return originToClone.get(node);
    }
    void traverse(Node node){
        if(node == null){
            return;
        }
        if(visited.contains(node)){
            return;
        }
        visited.add(node);
        originToClone.put(node,new Node(node.val));
        Node copyNode = originToClone.get(node);
        for(Node n : node.neighbors){
            traverse(n);
            copyNode.neighbors.add(originToClone.get(n));
        }
    }
}

四、力扣138. 随机链表的复制

java 复制代码
/*
// Definition for a Node.
class Node {
    int val;
    Node next;
    Node random;

    public Node(int val) {
        this.val = val;
        this.next = null;
        this.random = null;
    }
}
*/

class Solution {
    Map<Node , Node> map = new HashMap<>();
    public Node copyRandomList(Node head) {
        if(head == null){
            return null;
        }
        if(map.containsKey(head)){
            return map.get(head);
        }
        Node cur = new Node(head.val);
        map.put(head,cur);
        cur.next = copyRandomList(head.next);
        cur.random = copyRandomList(head.random);
        return cur;
    }
}
相关推荐
李慕婉学姐几秒前
【开题答辩过程】以《重庆市社区养老服务小程序设计与实现》为例,不会开题答辩的可以进来看看
java·spring boot
hello 早上好2 分钟前
持久化输出与 ChatMemory
java·spring
oak隔壁找我3 分钟前
Spring框架原理深度源码级解析
java·后端
回忆是昨天里的海5 分钟前
k8s安装-kubeadm join,将工作节点加入k8s集群
java·服务器·kubernetes
yinke小琪5 分钟前
谈谈项目中单点登录的实现原理
java·后端
浪飘9 分钟前
k8s device plugin
java·docker·kubernetes
欧克小奥15 分钟前
Floyd判圈算法(Floyd Cycle Detection Algorithm)
算法·floyd
一只游鱼22 分钟前
maven简介与安装
java·maven
KIKIiiiiiiii1 小时前
微信个人号开发中如何高效实现API二次开发
java·前端·python·微信
胡八一1 小时前
30 分钟上手 exp4j:在 Java 中安全、灵活地计算数学表达式
java·开发语言·安全