617. 合并二叉树
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL
的节点将直接作为新二叉树的节点。示例 1:
输入: Tree 1 Tree 2
1 2
/ \ / \
3 2 1 3
/ \ \
5 4 7 输出: 合并后的树:
3
/
4 5 / \ \ 5 4 7 注意: 合并必须从两个树的根节点开始。通过次数48,186提交次数63,360
第一反应憨憨的代码
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def mergeTrees(self, t1: TreeNode, t2: TreeNode) -> TreeNode:
def helper(root,t1,t2):
if not t1 and not t2:
return
if not t1 :
t1=TreeNode(0)
if not t2:
t2=TreeNode(0)
l1=t1.left.val if t1.left else 0
l2=t2.left.val if t2.left else 0
if t1.left or t2.left:
root.left=TreeNode(l1+l2)
helper(root.left,t1.left,t2.left)
r1=t1.right.val if t1.right else 0
r2=t2.right.val if t2.right else 0
if t1.right or t2.right:
root.right=TreeNode(r1+r2)
helper(root.right,t1.right,t2.right)
if not t1:
return t2
if not t2:
return t1
root=TreeNode(t1.val+t2.val)
helper(root,t1,t2)
return root
- 第一反应就是同时便利两个树,然后按照题目的要求判断情况,把结果生成到新建的树中。
改进!
(其实不用判断那么多的边界条件,就是假如一个为空可以直接返回另一棵树)
另外之前那种写法也有点自找麻烦
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def mergeTrees(self, t1: TreeNode, t2: TreeNode) -> TreeNode:
if not t1:
return t2
if not t2:
return t1
root=TreeNode(t1.val+t2.val)
root.left=self.mergeTrees(t1.left,t2.left)
root.right=self.mergeTrees(t1.right,t2.right)
return root
直接在原来的树上改会节约不少时间
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def mergeTrees(self, t1: TreeNode, t2: TreeNode) -> TreeNode:
if not t1:
return t2
if not t2:
return t1
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 mergeTrees(self, t1: TreeNode, t2: TreeNode) -> TreeNode:
if not t1:
return t2
if not t2:
return t1
stack=[(t1,t2)]
while stack:
node1,node2=stack.pop()
node1.val+=node2.val
if node1.left and node2.left:
stack.append((node1.left,node2.left))
elif node2.left:
node1.left=node2.left
if node1.right and node2.right:
stack.append((node1.right,node2.right))
elif node2.right:
node1.right=node2.right
return t1
一段时间没做数据结构的题,最近发现自己写的代码好憨!慢慢来吧,争取这段时间一天两道,尽快好起来。