LeetCode-1379. 找出克隆二叉树中的相同节点【树 深度优先搜索 广度优先搜索 二叉树】

LeetCode-1379. 找出克隆二叉树中的相同节点【树 深度优先搜索 广度优先搜索 二叉树】

  • 题目描述:
  • [解题思路一:递归,由于我们比较的是节点而不是节点值(例如 C++ 比较的是地址),所以下面的代码也适用于树中有值相同节点的情况(本题的进阶问题)。](#解题思路一:递归,由于我们比较的是节点而不是节点值(例如 C++ 比较的是地址),所以下面的代码也适用于树中有值相同节点的情况(本题的进阶问题)。)
  • [解题思路二:递归这题有几个关键点,一:判断 cloned == target是不行的,因为会依据地址进行判断,即使一样也不行,需用original is target。二:返回值接收第一个非None的值,return left or right 是返回不是None的。](#解题思路二:递归这题有几个关键点,一:判断 cloned == target是不行的,因为会依据地址进行判断,即使一样也不行,需用original is target。二:返回值接收第一个非None的值,return left or right 是返回不是None的。)
  • 解题思路三:0

题目描述:

给你两棵二叉树,原始树 original 和克隆树 cloned,以及一个位于原始树 original 中的目标节点 target。

其中,克隆树 cloned 是原始树 original 的一个 副本 。

请找出在树 cloned 中,与 target 相同 的节点,并返回对该节点的引用(在 C/C++ 等有指针的语言中返回 节点指针,其他语言返回节点本身)。

注意:你 不能 对两棵二叉树,以及 target 节点进行更改。只能 返回对克隆树 cloned 中已有的节点的引用。

示例 1:

输入: tree = [7,4,3,null,null,6,19], target = 3

输出: 3

解释: 上图画出了树 original 和 cloned。target 节点在树 original 中,用绿色标记。答案是树 cloned 中的黄颜色的节点(其他示例类似)。

示例 2:

输入: tree = [7], target = 7

输出: 7

示例 3:

输入: tree = [8,null,6,null,5,null,4,null,3,null,2,null,1], target = 4

输出: 4

提示:

树中节点的数量范围为 [1, 104] 。

同一棵树中,没有值相同的节点。

target 节点是树 original 中的一个节点,并且不会是 null 。

进阶:如果树中允许出现值相同的节点,将如何解答?

解题思路一:递归,由于我们比较的是节点而不是节点值(例如 C++ 比较的是地址),所以下面的代码也适用于树中有值相同节点的情况(本题的进阶问题)。

  1. 如果 original是空节点,返回空。
  2. 如果 original=target(注意这里比较的是节点,不是节点值),说明我们找到了对应的节点,返回 cloned。
  3. 否则递归 original 和 cloned 的左子树,如果返回值 leftRes 不为空,说明 target 在左子树中,返回 leftRes。
  4. 否则递归 original 和 cloned 的右子树,由于题目保证 target一定在二叉树中,所以直接返回递归右子树的返回值。
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:
        if original is None or original is target:
            return cloned
        return self.getTargetCopy(original.left, cloned.left, target) or \
               self.getTargetCopy(original.right, cloned.right, target)

时间复杂度:O(n)

空间复杂度:O(n)

解题思路二:递归这题有几个关键点,一:判断 cloned == target是不行的,因为会依据地址进行判断,即使一样也不行,需用original is target。二:返回值接收第一个非None的值,return left or right 是返回不是None的。

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:
        if not cloned:
            return None
        if original is target:
            return cloned
        left = self.getTargetCopy(original.left, cloned.left, target)
        right = self.getTargetCopy(original.right, cloned.right, target)
        return left or right

时间复杂度:O(n)

空间复杂度:O(n)

解题思路三:0

python 复制代码

时间复杂度:O(n)

空间复杂度:O(n)

相关推荐
小白菜又菜18 分钟前
Leetcode 646. Maximum Length of Pair Chain
算法·leetcode·职场和发展
小白菜又菜2 小时前
Leetcode 516. Longest Palindromic Subsequence
算法·leetcode·职场和发展
山脚ice6 小时前
【CT】LeetCode手撕—704. 二分查找
算法·leetcode
瑜陀6 小时前
2024.06.30 刷题日记
数据结构·算法·leetcode
Star Patrick6 小时前
*算法训练(leetcode)第二十天 | 39. 组合总和、40. 组合总和 II、131. 分割回文串
c++·算法·leetcode
阳光男孩017 小时前
力扣974.和可被K整除的子数组
数据结构·算法·leetcode
青釉Oo7 小时前
峰与谷00
java·数据结构·算法·leetcode
zengy59 小时前
代码随想录打卡第十三天
数据结构·c++·算法·leetcode
孑渡11 小时前
【LeetCode】每日一题:跳跃游戏
python·算法·leetcode·游戏·职场和发展
liulanba11 小时前
leetcode--二叉树中的最长交错路径
linux·算法·leetcode