时间复杂度:O(n)
解题思路
同时后序遍历两棵二叉树。
如果都是空结点,那就返回一个空结点。否则只要一个结点为空,另一个结点不为空,那么就返回不为空的节点。如果两个结点都不为空,那就将root2的结点值加到root1的结点中去,然后返回root1结点。
但是不要忘记及时更新root1的左右孩子情况,由于是后序遍历,当遍历结点时它的孩子结点已经遍历过了,所以让该结点的左右孩子更新为遍历后的情况。
AC代码
/**
* 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{
if root2==nil{
return nil
}
return root2
}
if root2==nil{
return root1
}
root1.Left=mergeTrees(root1.Left,root2.Left)
root1.Right=mergeTrees(root1.Right,root2.Right)
root1.Val+=root2.Val//将root2合并到root1中
return root1
}
感悟
又get到了一个小技巧,所有要求返回根节点的题目,都可以尝试用后序遍历的思路解题,因为遍历过程中,每次最后返回的都是根节点,这样后序遍历二叉树后,最后一个被遍历的结点就是这棵树的根节点。