617.合并二叉树


  1. 合并二叉树

难度简单412

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。

你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL
的节点将直接作为新二叉树的节点。

示例 1:

输入: 
Tree 1 Tree 2
1 2
/ \ / \
3 2 1 3
/ \ \
5 4 7
输出:
合并后的树:
3
/ \
4 5
/ \ \
5 4 7


1.dfs

时间复杂度为O(n)

空间复杂度为O(1)

public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
//如果某一个树的根节点为Null 返回另外一个,否则的话 返回Null
if(t1 == null || t2 == null){
return t1 == null ? t2 : t1;
}
return dfs(t1,t2);
}

public TreeNode dfs(TreeNode r1,TreeNode r2){
//终止条件
if(r1 == null ||r2 == null){
return r1 == null ? r2 : r1;
}
//r1.val 加上 r2.val
r1.val+=r2.val;
r1.left = dfs(r1.left,r2.left);
r1.right = dfs(r1.right,r2.right);
return r1;
}

2.Queue

左右子节点都不为Null的时候,直接添加到队列中,如果r1的左节点为Null r2的左节点不为Null 直接赋值

但是当r1的左节点不为Null r2的右节点不为Null 就不需要修改值。

时间复杂度为O(n)

空间复杂度为O(1) 对于满二叉树来说,要保存所有的叶子节点。N/2

public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
if(t1 == null || t2 == null){
return t1 == null ? t2 : t1;
}
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(t1);
queue.add(t2);
while(queue.size()>0){
TreeNode r1 = queue.remove();
TreeNode r2 = queue.remove();
r1.val +=r2.val;
//如果左右子节点不为null
if(r1.left!=null&&r2.left!=null){
queue.add(r1.left);
queue.add(r2.left);
}else if(r1.left == null){
//如果左子节点null 右子节点不为null
r1.left = r2.left;
}

//右子树
if(r1.right!=null&&r2.right!=null){
queue.add(r1.right);
queue.add(r2.right);
}else if(r1.right == null){
r1.right = r2.right;
}
}
return t1;
}