列表

详情


1485. 克隆含随机指针的二叉树

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

请返回该树的 深拷贝

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

该树以 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]]

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
/** * Definition for a 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) { } };

cpp 解法, 执行用时: 208 ms, 内存消耗: 74.6 MB, 提交时间: 2023-10-16 21:58:42

/**
 * 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:
    unordered_map<Node *, NodeCopy *> seen;

    NodeCopy* copyRandomBinaryTree(Node* root) {
        return dfs(root);
    }

    NodeCopy * dfs(Node * rt) {
        if (rt == NULL)
            return NULL;
        if (seen.find(rt) != seen.end())
            return seen[rt];
        NodeCopy * cur = new NodeCopy(rt->val);
        seen[rt] = cur;
        cur->left = dfs(rt->left);
        cur->right = dfs(rt->right);
        cur->random = dfs(rt->random);
        return cur;
    }
};

python3 解法, 执行用时: 200 ms, 内存消耗: 21.4 MB, 提交时间: 2023-10-16 21:57:42

# Definition for a binary tree node.
# class Node:
#     def __init__(self, val=0, left=None, right=None, random=None):
#         self.val = val
#         self.left = left
#         self.right = right
#         self.random = random
class Solution:
    def copyRandomBinaryTree(self, root: 'Node') -> 'NodeCopy':
        seen = dict()

        def dfs(root: 'Node') -> 'NodeCopy':
            if root == None:
                return None
            if root in seen:
                return seen[root]
            cur = NodeCopy(root.val)
            seen[root] = cur            #早入seen。最后再入就溢出了
            cur.left = dfs(root.left)
            cur.right = dfs(root.right)
            cur.random = dfs(root.random)
            return cur

        return dfs(root)

    def copyRandomBinaryTree2(self, root: 'Node') -> 'NodeCopy':
        if root == None:
            return None
        new_root = NodeCopy(root.val)
        seen = dict()
        seen[root] = new_root

        Q = [root]
        while Q:
            x = Q.pop(0)

            if x.left:
                Q.append(x.left)
                seen[x].left = seen[x.left] = NodeCopy(x.left.val)  #指针的关系,不断链
            if x.right:
                Q.append(x.right)
                seen[x].right = seen[x.right] = NodeCopy(x.right.val)
        
        for n, ncopy in seen.items():
            if n.random in seen.keys():
                ncopy.random = seen[n.random]

        return new_root

golang 解法, 执行用时: 80 ms, 内存消耗: 7.2 MB, 提交时间: 2023-10-16 21:57:01

/**
 * Definition for a Node.
 * type Node struct {
 *     Val int
 *     Left *Node
 *     Right *Node
 *     Random *Node
 * }
 */

func copyRandomBinaryTree(root *Node) *NodeCopy {
    connects := map[*Node]*NodeCopy{}
    var dfs func(root *Node)
    dfs = func(root *Node) {
        if root == nil {
            return
        }
        nNode := &NodeCopy{Val:root.Val}
        connects[root] = nNode
        dfs(root.Left)
        dfs(root.Right)
    }
    dfs(root)
    for old, new := range connects {
        new.Left = connects[old.Left]
        new.Right = connects[old.Right]
        new.Random = connects[old.Random]
    }
    return connects[root]
}

golang 解法, 执行用时: 80 ms, 内存消耗: 7.5 MB, 提交时间: 2023-10-16 21:56:43

/**
 * Definition for a Node.
 * type Node struct {
 *     Val int
 *     Left *Node
 *     Right *Node
 *     Random *Node
 * }
 */
func copyRandomBinaryTree(root *Node) *NodeCopy {
	dic := map[*Node]*NodeCopy{}
	var copyTree func(node *Node) *NodeCopy
	copyTree = func(node *Node) *NodeCopy {
		if node == nil {
			return nil
		}
		if dic[node] == nil {
			dic[node] = &NodeCopy{}
		}
		dic[node].Val = node.Val
		if node.Random != nil {
			if dic[node.Random] == nil {
				dic[node.Random] = &NodeCopy{}
			}
			dic[node].Random = dic[node.Random]
		}
		dic[node].Left = copyTree(node.Left)
		dic[node].Right = copyTree(node.Right)
		return dic[node]
	}
	return copyTree(root)
}

上一题