617.合并二叉树
题目
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
示例 1:1
2
3
4
5
6
7
8
9
10
11
12
13
14输入:
Tree 1 Tree 2
1 2
/ \ / \
3 2 1 3
/ \ \
5 4 7
输出:
合并后的树:
3
/ \
4 5
/ \ \
5 4 7
注意: 合并必须从两个树的根节点开始。
方法
方法1:递归
采用先序遍历的方式
- 如果tree1和tree2当前结点中,某个结点为None,则返回另一棵树的结点
- 如果tree1和tree2当前节点都存在,将两个结点的值相加,并更新为tree1的当前结点的值
- 结合两个树的左结点和右节点,递归调用主函数,继续处理当前结点的左子树和右子树
1 | # Definition for a binary tree node. |
方法2:迭代
迭代方法中采用栈记录二叉树tree1和tree2的结点信息[node1,node2],其中node1和node2分别表示tree1和tree2的结点。循环条件是栈不为空
- 两棵二叉树的根结点入栈
- 每次迭代,弹出栈顶元素,得到结点对,将节点对中的值相加并将其更新为tree1相应结点的值
- 对于左子树
- 如果tree1的左子树非空,将tree1和tree2的左子树入栈
- 如果tree1的左子树为空,将tree2的左孩子加到tree1的当前结点
- 对于右子树(同上述操作)
- 如果tree1和tree2的当前结点都为空,则继续弹出栈顶元素
- 对于左子树
1 | # Definition for a binary tree node. |