题目
给你两棵二叉树: root1 和 root2 。
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。
返回合并后的二叉树。
示例
输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]
输出:[3,4,5,5,4,null,7]
解析
这道题为了节省空间,可以选择将第二棵树合并到第一课树上,当然也可以新开一棵树;如果使用递归法,前中后序遍历都是可以的,下面是前序的解法:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func mergeTrees(root1 *TreeNode, root2 *TreeNode) *TreeNode {
if root1 == nil {
return root2
}
if root2 == nil {
return root1
}
root1.Val += root2.Val //覆盖到第一棵树上
root1.Left = mergeTrees(root1.Left, root2.Left)
root1.Right = mergeTrees(root1.Right, root2.Right)
return root1
}
迭代法的话,还是用一个list即可:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func mergeTrees(root1 *TreeNode, root2 *TreeNode) *TreeNode {
if root1 == nil {
return root2
}
if root2 == nil {
return root1
}
queue := list.New()
queue.PushBack(root1)
queue.PushBack(root2)
for queue.Len() > 0 {
node1 := queue.Remove(queue.Front()).(*TreeNode)
node2 := queue.Remove(queue.Front()).(*TreeNode)
node1.Val += node2.Val
if node1.Left != nil && node2.Left != nil {
queue.PushBack(node1.Left)
queue.PushBack(node2.Left)
}
if node1.Right != nil && node2.Right != nil {
queue.PushBack(node1.Right)
queue.PushBack(node2.Right)
}
if node1.Left == nil {
node1.Left = node2.Left
}
if node1.Right == nil {
node1.Right = node2.Right
}
}
return root1 //这里返回root1是因为本函数传进来的应该是两棵树的地址,将两棵树压入到队列中,还是地址,最后弹出的node1还是地址
}