2024/5/26 晴。是的,等下我要去长乐沙滩赶海哈哈,因为这几天数字峰会,地铁公交又免费啦。ok,今天做的是HOT100里面最后一道easy题目啦,明天就是要跨越一个难度啦!做题吧
1、题目描述
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!