Leetcode 617.合并二叉树
给你两棵二叉树: root1
和 root2
。
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。
返回合并后的二叉树。
注意: 合并过程必须从两个树的根节点开始。
输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7] 输出:[3,4,5,5,4,null,7]
示例 2:
输入:root1 = [1], root2 = [1,2] 输出:[2,2]
解题思路:
递归实现
如果没有头绪的话,可以将这两颗树想象成是两个数组:
1 3 2 5
2 1 3 4 7
合并两个数组很直观,将数组 2 的值合并到数组 1 中,再返回数组 1 就可以了。
对于二叉树来说,如果我们像遍历数组那样,挨个遍历两颗二叉树中的每个节点,再把他们相加,那问题就比较容易解决了。
遍历二叉树很简单,用 前序 遍历就可以了,再依次把访问到的节点值相加,因为题目没有说不能改变树的值和结构,我们不用再创建新的节点了,直接将树2合并到树1上再返回就可以了。
需要注意:这两颗树并不是长得完全一样,有的树可能有左节点,但有的树没有。
对于这种情况,我们统一的都把他们挂到树 1 上面就可以了,对于上面例子中的两颗树,合并起来的结果如下:
3
/ \
4 5
/ \ \
5 4 7
相当于树1少了一条腿,而树 2 有这条腿,那就把树 2 的拷贝过来。
总结下递归的条件:
以下三个判断语句作为递归调用的终止条件:
if (root1 == null && root2 == null)
:如果两个根节点都为null,说明两个树都为空,返回null,递归调用终止。if (root1 != null && root2 == null)
:如果其中一个根节点不为null,另一个根节点为null,就返回非空的根节点,递归调用终止。if (root1 == null && root2 != null)
:如果其中一个根节点为null,另一个根节点不为null,就返回非空的根节点,递归调用终止。
代码的思路是递归地合并两个二叉树。对于每个节点,如果两个树的对应节点都存在,就将它们的值相加作为新节点的值;如果只有一个树的对应节点存在,就直接使用该节点;如果两个树的对应节点都不存在,就返回null。
动画演示如下:
时间复杂度:O(N)O(N)O(N)
空间复杂度:O(h)O(h)O(h),hhh 是树的高度
代码实现:
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if(root1 == null && root2 == null){
return null;
}
if(root1 != null && root2 == null){
return root1;
}
if(root1 == null && root2!=null){
return root2;
}
TreeNode treeNode = new TreeNode(root1.val + root2.val);
treeNode.left = mergeTrees(root1.left,root2.left);
treeNode.right = mergeTrees(root1.right,root2.right);
return treeNode;
}
}
评论区