LeetCode617. 合并二叉树(递归DFS+迭代BFS队列)

1、题目描述

https://leetcode-cn.com/problems/merge-two-binary-trees/

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。

你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。

注意: 合并必须从两个树的根节点开始。

 

2、代码详解

递归写法DFS

时间复杂度:O(N) ;空间复杂度:O(h),h是树的高度,递归调用也需要空间,从根->叶子,一共是h层

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

class Solution(object):
    def mergeTrees(self, t1, t2):
        """
        :type t1: TreeNode
        :type t2: TreeNode
        :rtype: TreeNode
        """
        def dfs(r1, r2):
            # 终止条件:如果 r1和r2中,只要有一个是null,函数就直接返回
            if not (r1 and r2):
                return r1 if r1 else r2
            # 让r1的值 等于  r1和r2的值累加
            # 再递归的计算两颗树的左节点、右节点
            r1.val += r2.val
            r1.left = dfs(r1.left, r2.left)  # 再递归的执行两个树的左节点
            r1.right = dfs(r1.right, r2.right)  # 递归执行两个树的右节点
            return r1

        return dfs(t1, t2)

迭代写法(BFS借助队列)

时间复杂度:O(N) ;空间复杂度:O(N),对于满二叉树时,要保存所有的叶子节点,即N/2个节点。

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

class Solution(object):
    def mergeTrees(self, t1, t2):
        """
        :type t1: TreeNode
        :type t2: TreeNode
        :rtype: TreeNode
        """       
        # 迭代法:BFS,借助栈或者队列
        # 结束条件:如果 t1和t2中,只要有一个是null,函数就直接返回
        if not (t1 and t2):
            return t2 if not t1 else t1
        queue = [(t1, t2)]
        while queue:
            r1, r2 = queue.pop(0)
            r1.val += r2.val
            # 如果r1和r2的左子树都不为空,就放到队列中
            # 如果r1的左子树为空,就把r2的左子树挂到r1的左子树上
            if r1.left and r2.left:
                queue.append((r1.left, r2.left))
            elif not r1.left:
                r1.left = r2.left
            # 对于右子树也是一样的
            if r1.right and r2.right:
                queue.append((r1.right, r2.right))
            elif not r1.right:
                r1.right = r2.right
        return t1

https://leetcode-cn.com/problems/merge-two-binary-trees/solution/dong-hua-yan-shi-di-gui-die-dai-617he-bing-er-cha-/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值