1484 克隆含随机指针的二叉树

题目描述:
给你一个二叉树,树中每个节点都含有一个附加的随机指针,该指针可以指向树中的任何节点或者指向空(null)。
请返回该树的 深拷贝 。
该树的输入/输出形式与普通二叉树相同,每个节点都用 [val, random_index] 表示:
val:表示 Node.val 的整数
random_index:随机指针指向的节点(在输入的树数组中)的下标;如果未指向任何节点,则为 null 。
该树以 Node 类的形式给出,而你需要以 NodeCopy 类的形式返回克隆得到的树。NodeCopy 类和Node 类定义一致。

示例 1:
在这里插入图片描述
输入:root = [[1,null],null,[4,3],[7,0]]
输出:[[1,null],null,[4,3],[7,0]]
解释:初始二叉树为 [1,null,4,7] 。
节点 1 的随机指针指向 null,所以表示为 [1, null] 。
节点 4 的随机指针指向 7,所以表示为 [4, 3] 其中 3 是树数组中节点 7 对应的下标。
节点 7 的随机指针指向 1,所以表示为 [7, 0] 其中 0 是树数组中节点 1 对应的下标。

示例 2:
在这里插入图片描述
输入:root = [[1,4],null,[1,0],null,[1,5],[1,5]]
输出:[[1,4],null,[1,0],null,[1,5],[1,5]]
解释:节点的随机指针可以指向它自身。

示例 3:
在这里插入图片描述输入:root = [[1,6],[2,5],[3,4],[4,3],[5,2],[6,1],[7,0]]
输出:[[1,6],[2,5],[3,4],[4,3],[5,2],[6,1],[7,0]]

示例 4:
输入:root = []
输出:[]

示例 5:
输入:root = [[1,null],null,[2,null],null,[1,null]]
输出:[[1,null],null,[2,null],null,[1,null]]

提示:
tree 中节点数目范围是 [0, 1000]
每个节点的值的范围是 [1, 10^6]

方法1:
主要思路:解题链接汇总
(1)使用哈希来存储原始树和复制树之间的对应关系;
(2)两次对树的遍历,一次生成复制树,一次连接随机结点;

/**
 * Definition for a binary tree node.
 * struct Node {
 *     int val;
 *     Node *left;
 *     Node *right;
 *     Node *random;
 *     Node() : val(0), left(nullptr), right(nullptr), random(nullptr) {}
 *     Node(int x) : val(x), left(nullptr), right(nullptr), random(nullptr) {}
 *     Node(int x, Node *left, Node *right, Node *random) : val(x), left(left), right(right), random(random) {}
 * };
 */
class Solution {
public:
	//生成复制树
    NodeCopy* new_tree(Node*root,unordered_map<Node*,NodeCopy*>&mp){
        if(root==nullptr){
            return nullptr;
        }
        NodeCopy* cur=new NodeCopy(root->val);
        mp[root]=cur;//保存结点之间的对应关系,便于后面实现随机结点的连接
        NodeCopy* left_node=new_tree(root->left,mp);
        NodeCopy* right_node=new_tree(root->right,mp);
        cur->left=left_node;
        cur->right=right_node;
        return cur;
    }
    void copy_random(Node*root,NodeCopy* new_root,unordered_map<Node*,NodeCopy*>&mp){
        if(root==nullptr){
            return;
        }
        if(root->random!=nullptr){//连接随机结点
            new_root->random=mp[root->random];
        }
        copy_random(root->left,new_root->left,mp);
        copy_random(root->right,new_root->right,mp);
    }
    NodeCopy* copyRandomBinaryTree(Node* root) {
        unordered_map<Node*,NodeCopy*> mp;
        NodeCopy* new_root=new_tree(root,mp);
        copy_random(root,new_root,mp);
        return new_root;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值