给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
示例 1:
解题思路:
自顶向下进行合并,分情况进行讨论:
- (1)当tree1,tree2都为空时,返回None
- (2)当tree1为空时,返回tree2
- (3)当tree2为空时,返回tree1
- (4)当tree1,tree2都不为空时,将两树的值相加,同理:两树的左子树都不为空时,合并为新树的左子树,两树的右子树都不为空时,合并为新树的右子树。
递归完成算法
代码实现:
def mergeTrees(self, t1: TreeNode, t2: TreeNode) -> TreeNode:
if(t1 == None and t2 == None):
return None
if(t2 == None):
return t1
elif(t1 == None):
return t2
else:
t1.val = t1.val + t2.val
t1.left = self.mergeTrees(t1.left,t2.left)
t1.right = self.mergeTrees(t1.right,t2.right)
return t1
代码测试:
# Definition for a binary tree node.
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def __init__(self):
self.res = list()
def mergeTrees(self, t1: TreeNode, t2: TreeNode) -> TreeNode:
if(t1 == None and t2 == None):
return None
if(t2 == None):
return t1
elif(t1 == None):
return t2
else:
t1.val = t1.val + t2.val
t1.left = self.mergeTrees(t1.left,t2.left)
t1.right = self.mergeTrees(t1.right,t2.right)
return t1
# def mergeTrees(self, t1: TreeNode, t2: TreeNode) -> TreeNode:
# if t1 and t2 :
# t1.val += t2.val
# t1.left = self.mergeTrees(t1.left, t2.left)
# t1.right = self.mergeTrees(t1.right, t2.right)
# return t1
# return t1 or t2
def inorderTraversal(self, root: TreeNode):
if root:
self.t(root)
return self.res
def t(self, root):
if root.left != None:
self.t(root.left)
self.res.append(root.val)
if root.right != None:
self.t(root.right)
root1 = TreeNode(3)
n1 = TreeNode(2)
root1.left = n1
n2 = TreeNode(4)
root1.right = n2
n1.left = TreeNode(0)
n2.right = TreeNode(8)
n1 = TreeNode(4)
n2 = TreeNode(2)
n3 = TreeNode(7)
n4 = TreeNode(1)
n5 = TreeNode(3)
n1.left = n2
n1.right = n3
n2.left = n4
n2.right = n5
s = Solution()
result =s.mergeTrees(root1,n1)
print(result)