Approach
Depth-first search
For Clone Binary Tree with Random Pointer, the implementation follows one branch at a time, making it suitable for components, trees, backtracking, or dependency exploration.
- Define the state carried into one recursive or stack frame.
- Mark or choose the current state before exploring children.
- Combine child results or undo the choice when the branch finishes.
Code notes
- 149 lines of Python from the credited upstream file clone-binary-tree-with-random-pointer.py.
- The implementation visibly relies on hash lookup.
- No explicit loop blocks detected, together with recursive traversal.
Complexity
Count unique states for graph traversal; for backtracking, count the branching factor and maximum depth.
Check the problem constraints before deciding whether this complexity will pass.
Use this to learn the idea, then write your own version.
123 45class Node(object):6 def __init__(self, val=0, left=None, right=None, random=None):7 self.val = val8 self.left = left9 self.right = right10 self.random = random11 12 1314class NodeCopy(object):15 def __init__(self, val=0, left=None, right=None, random=None):16 pass17 18 19class Solution(object):20 def copyRandomBinaryTree(self, root):21 """22 :type root: Node23 :rtype: NodeCopy24 """25 def iter_dfs(node, callback):26 result = None27 stk = [node]28 while stk:29 node = stk.pop()30 if not node:31 continue32 left_node, copy = callback(node)33 if not result:34 result = copy35 stk.append(node.right)36 stk.append(left_node)37 return result38 39 def merge(node):40 copy = NodeCopy(node.val)41 node.left, copy.left = copy, node.left42 return copy.left, copy43 44 def clone(node):45 copy = node.left46 node.left.random = node.random.left if node.random else None47 node.left.right = node.right.left if node.right else None48 return copy.left, copy49 50 def split(node):51 copy = node.left52 node.left, copy.left = copy.left, copy.left.left if copy.left else None53 return node.left, copy54 55 iter_dfs(root, merge)56 iter_dfs(root, clone)57 return iter_dfs(root, split)58 59 606162class Solution_Recu(object):63 def copyRandomBinaryTree(self, root):64 """65 :type root: Node66 :rtype: NodeCopy67 """68 def dfs(node, callback):69 if not node:70 return None71 left_node, copy = callback(node)72 dfs(left_node, callback)73 dfs(node.right, callback) 74 return copy75 76 def merge(node):77 copy = NodeCopy(node.val)78 node.left, copy.left = copy, node.left79 return copy.left, copy80 81 def clone(node):82 copy = node.left83 node.left.random = node.random.left if node.random else None84 node.left.right = node.right.left if node.right else None85 return copy.left, copy86 87 def split(node):88 copy = node.left89 node.left, copy.left = copy.left, copy.left.left if copy.left else None90 return node.left, copy91 92 dfs(root, merge)93 dfs(root, clone)94 return dfs(root, split)95 96 979899import collections100 101 102class Solution2(object):103 def copyRandomBinaryTree(self, root):104 """105 :type root: Node106 :rtype: NodeCopy107 """ 108 lookup = collections.defaultdict(lambda: NodeCopy())109 lookup[None] = None110 stk = [root]111 while stk:112 node = stk.pop()113 if not node:114 continue115 lookup[node].val = node.val116 lookup[node].left = lookup[node.left]117 lookup[node].right = lookup[node.right]118 lookup[node].random = lookup[node.random]119 stk.append(node.right)120 stk.append(node.left)121 return lookup[root]122 123 124125126import collections127 128 129class Solution2_Recu(object):130 def copyRandomBinaryTree(self, root):131 """132 :type root: Node133 :rtype: NodeCopy134 """ 135 def dfs(node, lookup):136 if not node:137 return138 lookup[node].val = node.val139 lookup[node].left = lookup[node.left]140 lookup[node].right = lookup[node.right]141 lookup[node].random = lookup[node.random]142 dfs(node.left, lookup)143 dfs(node.right, lookup)144 145 lookup = collections.defaultdict(lambda: NodeCopy())146 lookup[None] = None147 dfs(root, lookup)148 return lookup[root]149