欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-20 10:19:13
...

1、题目描述

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

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

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

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

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

 

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-/