1. 题目描述
题目来源:力扣
给你两棵二叉树: root1 和 root2 。
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。
返回合并后的二叉树。
注意: 合并过程必须从两个树的根节点开始。
图1. 二叉树融合示例
2. 题解
解题思路:
根据题意,从两颗树的根节点开始,如果当前位置两棵树都有节点,那么就节点相加,否则,保留有节点的值。那么该节点的左子树仍为当前两个节点的左子树融合;当前的右子树仍为当前两个节点的右子树融合,直到两个节点的左右子树都是空为止。根据该分析,使用递归求解。算法如下,
(1)初始化root为当前两个根节点之和,若其中一个节点为空,则保留另外一个节点;
(2)若当前节点有左子树,当前节点的左子树为左子树递归调用该函数的结果;
(3)若当前节点有右子树,当前节点的右子树为右子树递归调用该函数的结果;
直到左右子树都为空为止,返回结果。
代码如下,
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def mergeTrees(self, root1, root2):
"""
:type root1: TreeNode
:type root2: TreeNode
:rtype: TreeNode
"""
if root1 != None and root2 != None:
root = TreeNode(root1.val + root2.val)
if root1.left != None and root2.left != None:
root.left = self.mergeTrees(root1.left, root2.left)
elif root1.left != None:
root.left = self.mergeTrees(root1.left, None)
elif root2.left != None:
root.left = self.mergeTrees(None, root2.left)
if root1.right != None and root2.right != None:
root.right = self.mergeTrees(root1.right, root2.right)
elif root1.right != None:
root.right = self.mergeTrees(root1.right, None)
elif root2.right != None:
root.right = self.mergeTrees(None, root2.right)
elif root1 != None:
root = TreeNode(root1.val)
if root1.left != None:
root.left = self.mergeTrees(root1.left, None)
if root1.right != None:
root.right = self.mergeTrees(root1.right, None)
elif root2 != None:
root = TreeNode(root2.val)
if root2.left != None:
root.left = self.mergeTrees(None, root2.left)
if root2.right != None:
root.right = self.mergeTrees(None, root2.right)
else:
return
return root
其中一个细节需要注意,即当root1和root2有一个为None时,判断左右子树是否存在时应注意None没有左右子树,无从判断;和root1和root2都非空时的情况不太一致,考虑的情况更少,仅需判断当前非空节点是否有左右子树即可。