LeetCode 1484. 克隆含随机指针的二叉树(哈希/递归)

文章目录

    • 1. 题目
    • 2. 解题
      • 2.1 原地算法
      • 2.2 哈希表

1. 题目

给你一个二叉树,树中每个节点都含有一个附加的随机指针,该指针可以指向树中的任何节点或者指向空(null)。

请返回该树的 深拷贝 。

该树的输入/输出形式与普通二叉树相同,每个节点都用 [val, random_index] 表示:

val:表示 Node.val 的整数
random_index:随机指针指向的节点(在输入的树数组中)的下标;如果未指向任何节点,则为 null 。
该树以 Node 类的形式给出,而你需要以 NodeCopy 类的形式返回克隆得到的树。

示例 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]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/clone-binary-tree-with-random-pointer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

类似题目:LeetCode 138. 复制带随机指针的链表(哈希 / 深拷贝)

2.1 原地算法

  • 先copy整棵树
  • 再链接random
/*** 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* copyRandomBinaryTree(Node* root) {if(!root) return NULL;NodeCopy* newroot = new NodeCopy(root->val);build(root, newroot);connect(root, newroot, root, newroot);return newroot;}void build(Node* root, NodeCopy* newroot){if(root->left){NodeCopy* l = new NodeCopy(root->left->val);newroot->left = l;build(root->left, l);}if(root->right){NodeCopy* r = new NodeCopy(root->right->val);newroot->right = r;build(root->right, r);}}void connect(Node* root, NodeCopy* newroot, Node* cur1,  NodeCopy* cur2){if(!cur1) return;if(cur1->random)cur2->random = find(root, newroot, cur1->random);connect(root, newroot, cur1->left, cur2->left);connect(root, newroot, cur1->right, cur2->right);}NodeCopy* find(Node* root, NodeCopy* newroot, Node* rd){if(!root) return NULL;if(root == rd) return newroot;auto l = find(root->left, newroot->left, rd);if(l) return l;auto r = find(root->right, newroot->right, rd);return r;}
};

2.2 哈希表

class Solution {unordered_map<Node*,NodeCopy*> m;
public:NodeCopy* copyRandomBinaryTree(Node* root) {if(!root) return NULL;NodeCopy* newroot = new NodeCopy(root->val);m[root] = newroot;build(root, newroot);connect(root, newroot);return newroot;}void build(Node* root, NodeCopy* newroot){if(root->left){NodeCopy* l = new NodeCopy(root->left->val);newroot->left = l;m[root->left] = l;build(root->left, l);}if(root->right){NodeCopy* r = new NodeCopy(root->right->val);newroot->right = r;m[root->right] = r;build(root->right, r);}}void connect(Node* root, NodeCopy* newroot){if(!root) return;if(root->random)newroot->random = m[root->random];connect(root->left, newroot->left);connect(root->right, newroot->right);}
};

我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QTreeWidget的基本操作

在主函数中增加&#xff1a; init();connect(ui->treeWidget,SIGNAL(itemChanged(QTreeWidgetItem*, int)),this,SLOT(treeItemChanged(QTreeWidgetItem*,int)));函数实现&#xff1a; void Widget::init() {ui->treeWidget->setHeaderLabels(QStringList()<<&q…

extjs2.0 ie8 下拉树_ExtJs下拉树的实现

直接上代码&#xff1a;Ext.ux.TreeCombo Ext.extend(Ext.form.ComboBox, {constructor : function(cfg) {cfg cfg || {};Ext.ux.TreeCombo.superclass.constructor.call(this, Ext.apply({maxHeight : 300,editable : false,mode : local,triggerAction : all,rootVisible :…

LeetCode 294. 翻转游戏 II(记忆化递归)

文章目录1. 题目2. 解题1. 题目 你和朋友玩一个叫做「翻转游戏」的游戏&#xff0c; 游戏规则&#xff1a;给定一个只有 和 - 的字符串。 你和朋友轮流将 连续 的两个 "" 反转成 "--"。 当一方无法进行有效的翻转时便意味着游戏结束&#xff0c;则另一方…

CMD 命令行查看端口被哪个程序占用,并根据PID值,找到相应的程序,关闭掉对应服务或进程!...

CMD 命令行查看端口被哪个程序占用&#xff0c;并根据PID值&#xff0c;找到相应的程序&#xff0c;关闭掉对应服务或进程&#xff01;不用任何第三方软件的情况下&#xff0c;打开CMD执行如下命令&#xff1a;1&#xff0c;netstat -ano 你可以查看到Local Address下面的80端口…

mysql 逻辑备份导入数据库_mysql逻辑备份(mysql dump的使用)

mysqldump 属于MySQL客户端工具mysqldump备份工具对于MyISAM存储引擎实现备份是温备份&#xff0c;对innodb存储引擎是可以实现热备份。使用mysqldump备份数据库可以实现完全备份 二进制日志文件&#xff0c;这样也算是完全备份 增量备份。首先将这个数据库备份下来这就是完全…

LeetCode 271. 字符串的编码与解码(4位16进制字符+字符串)

文章目录1. 题目2. 解题1. 题目 请你设计一个算法&#xff0c;可以将一个 字符串列表 编码成为一个 字符串。 这个编码后的字符串是可以通过网络进行高效传送的&#xff0c;并且可以在接收端被解码回原来的字符串列表。 1 号机&#xff08;发送方&#xff09;有如下函数&…

通过SQL Server 2008 访问Oracle 10g

之前写过一篇关于SQL Server 访问MySQL 数据库的文章&#xff0c;最近正好又遇到需要访问Oracle 的情况&#xff0c;将配置过程记录下来也供大家参考。 准备工作 事先在需要访问Oracle 数据库的主机上完成以下工作&#xff1a; 1. 安装SQL Server 数据库&#xff1a;SQL Server…

mysql注入技巧原理_MySQL注入技巧总结

0x00 介绍以下所有技巧都只在mysql适用&#xff0c;因为它太灵活了。0x01 MYSQl灵活的语法1 MySQL语法以及认证绕过注释符&#xff1a;#&#xff0c;-- X(X为任意字符)/*(MySQL-5.1);%00or 11;%00or 11 union select 1,2or 11 #/*!50000or*/ 11 -- - //版本号为5.1.38时只要小于…

LeetCode 410. 分割数组的最大值(极小极大化 二分查找 / DP)

文章目录1. 题目2. 解题2.1 二分查找2.2 DP1. 题目 给定一个非负整数数组和一个整数 m&#xff0c;你需要将这个数组分成 m 个非空的连续子数组。 设计一个算法使得这 m 个子数组各自和的最大值最小。 注意: 数组长度 n 满足以下条件: 1 ≤ n ≤ 1000 1 ≤ m ≤ min(50, n)示…

python 强制结束线程_在python中实现强制关闭线程的示例

Python 如何强制关闭线程过去只可以用来回忆&#xff0c;别沉迷在阴影中&#xff0c;否则永远看不清前面的路。Python用sleep停止一个线程的运行&#xff0c;而不影响主线程的运行&#xff0c;案例代码如下&#xff1a; from threading import *import time class MyThread(Thr…

Visual studio 2012 ultimate 安装遇到 Prerequisites , 错误的函数 incorrect function

如题 很奇怪, 然后 google , 给出的方案都不行........ 最后发现 原来iso没下全...........1.3gb, 原本是1.48gb 的............. 转载于:https://www.cnblogs.com/norsd/archive/2013/01/13/6359443.html

LeetCode 1121. 将数组分成几个递增序列

文章目录1. 题目2. 解题1. 题目 给你一个 非递减 的正整数数组 nums 和整数 K&#xff0c;判断该数组是否可以被分成一个或几个 长度至少 为 K 的 不相交的递增子序列。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,2,3,3,4,4], K 3 输出&#xff1a;true 解释&#xff…

mysql注入单引号被过滤_证明过滤单引号的ORDER BY可以注入

题目&#xff1a;证明基于ORDER BY的SQL 注入&#xff0c;且单引号(’)被过滤。已知&#xff1a;代码如下&#xff0c;有注入无悬念。$sortColumn mysqli_real_escape_string($_GET[sort_column]);$query "SELECT * from cr0_3 WHERE active true ORDER BY $sortColumn …

error_reporting()的用法

PHP代码的调试 有时我们运行PHP代码的时候会碰到问题并且我们不知道这问题究竟出在哪儿。而PHP中专门有个error_reporting() 函数,它可以告诉你你的代码中的每一处错误。如果你希望它显示页面的所有可能出现的错误信息&#xff0c;可以将下面这句代码放在文件的第二行&#xff…

LeetCode 1272. 删除区间

文章目录1. 题目2. 解题1. 题目 给你一个 有序的 不相交区间列表 intervals 和一个要删除的区间 toBeRemoved&#xff0c; intervals 中的每一个区间 intervals[i] [a, b] 都表示满足 a < x < b 的所有实数 x 的集合。 我们将 intervals 中任意区间与 toBeRemoved 有交…

mysql多种join_MySQL的几种Join

/* 左表t1*/DROP TABLE IF EXISTS t1;CREATE TABLE t1 (id INT NOT NULL,NAME VARCHAR(20));INSERT INTO t1 VALUES (1,‘t1a‘);INSERT INTO t1 VALUES (2,‘t1b‘);INSERT INTO t1 VALUES (3,‘t1c‘);INSERT INTO t1 VALUES (4,‘t1d‘);INSERT INTO t1 VALUES (5,‘t1f‘);…

V折扣购买流程图

以前画的V折扣购买流程图&#xff1a; 转载于:https://www.cnblogs.com/wangkongming/archive/2013/01/16/2862275.html

LeetCode 549. 二叉树中最长的连续序列(树上DP)

文章目录1. 题目2. 解题1. 题目 给定一个二叉树&#xff0c;你需要找出二叉树中最长的连续序列路径的长度。 请注意&#xff0c;该路径可以是递增的或者是递减。 例如&#xff0c;[1,2,3,4] 和 [4,3,2,1] 都被认为是合法的&#xff0c;而路径 [1,2,4,3] 则不合法。 另一方面&…

mysql创建库并创建用户_mysql创建数据库并创建用户授权

CREATE USER myuser IDENTIFIED BY mypassword;创建一个不受主机限制的用户myuser&#xff0c;并且指定密码是mypasswordCREATE USER myuserlocalhost IDENTIFIED BY mypassword;或者CREATE USER myuser192.168.1.99 IDENTIFIED BY mypassword;创建一个制定主机访问的用户myuse…

【转】[iOS] 关于 self = [super init];

http://blog.csdn.net/wihing/article/details/7316041 转载于:https://www.cnblogs.com/ygm900/archive/2013/01/16/2862655.html