📌  相关文章
📜  克隆带有随机指针的二叉树(1)

📅  最后修改于: 2023-12-03 14:50:03.308000             🧑  作者: Mango

克隆带有随机指针的二叉树

在二叉树中,每个节点都有一个指向左节点和右节点的指针。但是,在某些情况下,我们可能需要为节点添加一个指向任意节点的指针,这就是随机指针,它可以指向二叉树中的任意节点。

当我们需要克隆一个带有随机指针的二叉树时,需要考虑如何同时复制节点和随机指针的关系。下面给出一个使用哈希表的方法来实现这个过程。

算法步骤
  1. 建立一个哈希表用来存储原二叉树节点和克隆二叉树节点的对应关系。
  2. 遍历原二叉树,在遍历每个节点时,创建一个克隆节点并将它保存在哈希表中,同时处理节点之间的三个指针关系:左节点指针、右节点指针和随机指针。
  3. 迭代地复制每个节点的左右子节点和随机节点的指针关系。
  4. 返回哈希表中存储的克隆二叉树的根节点。
代码实现
# 定义二叉树节点的类
class Node:
    def __init__(self, val, left, right, random):
        self.val = val
        self.left = left
        self.right = right
        self.random = random

def copyRandomBinaryTree(root: 'Node') -> 'Node':
    # 哈希表用来存储原二叉树节点和克隆二叉树节点的对应关系
    visited = {}

    # 递归函数用来从原二叉树复制节点和随机指针关系到克隆二叉树,并返回克隆后的节点
    def clone(node: 'Node') -> 'Node':
        if not node:
            return None
        if node in visited:
            return visited[node]
        # 创建克隆节点并保存在哈希表中
        clone_node = Node(node.val, None, None, None)
        visited[node] = clone_node
        # 递归赋值左节点、右节点和随机节点指针
        clone_node.left = clone(node.left)
        clone_node.right = clone(node.right)
        clone_node.random = clone(node.random)
        return clone_node

    # 分别从原二叉树和克隆二叉树的根节点开始复制节点
    return clone(root)
复杂度分析
  • 时间复杂度:$O(N)$,其中$N$是二叉树中节点的数量。我们需要遍历每个节点一次并复制它们的三个指针关系(左节点指针、右节点指针和随机指针),因此总时间复杂度是$O(N)$。
  • 空间复杂度:$O(N)$。哈希表最多存储$N$个节点的对应关系。递归深度最大为$N$,因此系统栈的空间复杂度也是$O(N)$。