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)

相关推荐
浩瀚星辰202411 小时前
图论基础算法:DFS、BFS、并查集与拓扑排序的Java实现
java·算法·深度优先·图论
JiaJZhong13 小时前
力扣.最长回文子串(c++)
java·c++·leetcode
凌肖战14 小时前
力扣网编程150题:加油站(贪心解法)
算法·leetcode·职场和发展
吃着火锅x唱着歌14 小时前
LeetCode 3306.元音辅音字符串计数2
算法·leetcode·c#
kngines14 小时前
【力扣(LeetCode)】数据挖掘面试题0003: 356. 直线镜像
leetcode·数据挖掘·直线镜像·对称轴
不見星空15 小时前
【leetcode】1751. 最多可以参加的会议数目 II
算法·leetcode
不見星空15 小时前
leetcode 每日一题 3439. 重新安排会议得到最多空余时间 I
算法·leetcode
SsummerC15 小时前
【leetcode100】下一个排列
python·算法·leetcode
shylyly_17 小时前
专题一_双指针_查找总价格为目标值的两个商品
c++·算法·leetcode·双指针·查找总价格为目标值的两个商品·和为s的两个数
嗜好ya18 小时前
LeetCode 560: 和为K的子数组
数据结构·算法·leetcode