# 1379. Find a Corresponding Node of a Binary Tree in a Clone of That Tree

#### Medium

***

Given two binary trees `original` and `cloned` and given a reference to a node `target` in the original tree.

The `cloned` tree is a **copy of** the `original` tree.

Return *a reference to the same node* in the `cloned` tree.

**Note** that you are **not allowed** to change any of the two trees or the `target` node and the answer **must be** a reference to a node in the `cloned` tree.

&#x20;

**Example 1:**

![](https://assets.leetcode.com/uploads/2020/02/21/e1.png)

```
Input: tree = [7,4,3,null,null,6,19], target = 3
Output: 3
Explanation: In all examples the original and cloned trees are shown. The target node is a green node from the original tree. The answer is the yellow node from the cloned tree.
```

**Example 2:**

![](https://assets.leetcode.com/uploads/2020/02/21/e2.png)

```
Input: tree = [7], target =  7
Output: 7
```

**Example 3:**

![](https://assets.leetcode.com/uploads/2020/02/21/e3.png)

```
Input: tree = [8,null,6,null,5,null,4,null,3,null,2,null,1], target = 4
Output: 4
```

&#x20;

**Constraints:**

* The number of nodes in the `tree` is in the range `[1, 104]`.
* The values of the nodes of the `tree` are unique.
* `target` node is a node from the `original` tree and is not `null`.

&#x20;

**Follow up:** Could you solve the problem if repeated values on the tree are allowed?

#### Solution 1

```python
class Solution:
    def getTargetCopy(self, original: TreeNode, cloned: TreeNode, target: TreeNode) -> TreeNode:
        def recursion(root1, root2):
            if root1:
                recursion(root1.left, root2.left)
                if root1 is target:
                    self.ans = root2
                recursion(root1.right, root2.right)
        recursion(original, cloned)
        return self.ans
```

#### Solution 2

```python
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def getTargetCopy(self, original: TreeNode, cloned: TreeNode, target: TreeNode) -> TreeNode:
        self.target = target
        node1 = self.getNode(original)
        node2 = self.getNode(cloned)
        if self.isSame(node1, node2):
            return node2
        return target
    
    def getNode(self, root):
        if root is None:
            return
        if root.val == self.target.val:
            return root
        return self.getNode(root.left) or self.getNode(root.right)
        
    def isSame(self, root1: TreeNode, root2: TreeNode) -> bool:
        if root1 is None and root2 is None:
            return True
        if root1 is None or root2 is None:
            return False
        return root1.val == root2.val and self.isSame(root1.left, root2.left) and self.isSame(root1.right, root2.right)
```
