LeetCode617. 合并二叉树(递归DFS+迭代BFS队列)
程序员文章站
2022-05-20 10:19:13
...
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
下一篇: 617. 合并二叉树(python)