合并二叉树的核心思想是同时遍历两棵树的对应节点,若节点都存在则值相加,否则直接取非空节点作为结果。该操作可通过递归或迭代实现。
(一)递归法(前序遍历)
步骤:
1、终止条件: 若 t1 为空,返回 t2; 若 t2 为空,返回 t1。
2、处理当前节点: 将 t1.val += t2.val。
3、递归处理左右子树: t1.left = mergeTrees(t1.left, t2.left)
t1.right = mergeTrees(t1.right, t2.right)
4、返回合并后的 root1。
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param t1 TreeNode类
# @param t2 TreeNode类
# @return TreeNode类
#
class Solution:
def mergeTrees(self , t1: TreeNode, t2: TreeNode) -> TreeNode:
# write code here DFS
if not t1:
return t2
if not t2:
return t1
t1.val += t2.val
t1.left = self.mergeTrees(t1.left,t2.left)
t1.right = self.mergeTrees(t1.right,t2.right)
return t1
该方法简洁高效,直接在原树上修改,节省空间。
(二)迭代法(队列层序遍历)
步骤:
1、若有一棵树为空,直接返回另一棵。
2、使用队列存储成对节点 (node1, node2)。
3、每次出队一对节点: 将 node1.val += node2.val。 若两者左子节点都存在,入队;否则若 node1.left 为空则赋值为 node2.left。 同理处理右子节点。
4、返回修改后的 root1。
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param t1 TreeNode类
# @param t2 TreeNode类
# @return TreeNode类
#
class Solution:
def mergeTrees(self , t1: TreeNode, t2: TreeNode) -> TreeNode:
# write code here BFS
if not t1:
return t2
if not t2:
return t1
s = [(t1,t2)]
while s:
p = s.pop()
p[0].val += p[1].val
if p[0].left and p[1].left:
s += [(p[0].left,p[1].left)]
elif not p[0].left:
p[0].left = p[1].left
if p[0].right and p[1].right:
s += [(p[0].right,p[1].right)]
elif not p[0].right:
p[0].right = p[1].right
return t1
迭代法适合避免深递归导致的栈溢出。
建议:数据量小可用递归,数据量大或树深时推荐迭代。



京公网安备 11010502036488号