2024/5/26 晴。是的,等下我要去长乐沙滩赶海哈哈,因为这几天数字峰会,地铁公交又免费啦。ok,今天做的是HOT100里面最后一道easy题目啦,明天就是要跨越一个难度啦!做题吧
1、题目描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/51515c16bfe24bbb9aed18d2809835c8.png)
2、逻辑分析
题目要求:给定两个二叉树,要求合并它们。合并的规则就是:类似于将它们叠起来,重合部分相加,未重合部分就为数值不为空的数据加入。那么,怎么做呢?我的思路是:以深度或广度优先搜索来遍历这两棵树A和B,遍历顺序同步,如果相同节点都有数据,那么相加后给到A树上,如果只有一个树节点有数据,也是给到A树对应的节点上,最后返回A树即可。看了题解,官方也是给出了这两种方法。官方给出的步骤分析非常清晰,我直接放这里:LeetCode题解
3、代码演示
```java
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if( root1 == null){
return root2;
}
if(root2 == null){
return root1;
}
TreeNode merged = new TreeNode(root1.val + root2.val);
merged.left = mergeTrees(root1.left, root2.left);
merged.right = mergeTrees(root1.right, root2.right);
return merged;
}
时间复杂度:O(min(m,n)),空间复杂度:O(min(m,n))。
深度优先搜索里面是递归的思想,之前也做过几道类似的题目,所以理解起来很顺畅,接下来看看广度优先搜索的具体实现吧。实现思路:使用三个队列,两个用来存放两个二叉树遍历的值,另一个用来存储新二叉树的值。直接上代码:
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if(root1 == null){
return root2;
}
if(root2 == null){
return root1;
}
TreeNode merged = new TreeNode(root1.val + root2.val);
Queue<TreeNode> queue = new LinkedList<TreeNode>();
Queue<TreeNode> queue1 = new LinkedList<TreeNode>();
Queue<TreeNode> queue2 = new LinkedList<TreeNode>();
queue.offer(merged);
queue1.offer(root1);
queue2.offer(root2);
while(!queue1.isEmpty() && !queue2.isEmpty()){
TreeNode node = queue.poll(), node1 = queue1.poll(), node2 = queue2.poll();
TreeNode left1 = node1.left, left2 = node2.left, right1 = node1.right, right2 = node2.right;
if(left1 != null || left2 != null){
if(left1 != null && left2 != null){
TreeNode left = new TreeNode(left1.val + left2.val);
node.left = left;
queue.offer(left);
queue1.offer(left1);
queue2.offer(left2);
}else if(left1 != null){
node.left = left1;
}else if(left2 != null){
node.left = left2;
}
}
if(right1 != null || right2 != null){
if(right1 != null && right2 != null){
TreeNode right = new TreeNode(right1.val + right2.val);
node.right = right;
queue.offer(right);
queue1.offer(right1);
queue2.offer(right2);
}else if(right1 != null){
node.right = right1;
}else if(right2 != null){
node.right = right2;
}
}
}
return merged;
}
代码比较冗长,但是理解起来还是很方便了,逻辑更为清晰了。时间复杂度:O(min(m,n)),空间复杂度:O(min(m,n))。
ok啦,HOT100的Easy部分也就告一段落啦,接下来就是中等和困难啦!准备去赶海啦,这对一个中部地区生长的孩子是有莫大的吸引力的,BYE!