给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
示例 1:
输入: Tree 1 Tree 2 1 2 / \ / \ 3 2 1 3 / \ \ 5 4 7 输出: 合并后的树: 3 / \ 4 5 / \ \ 5 4 7
注意: 合并必须从两个树的根节点开始。
DFS1(40ms)
class Solution {
public:
// Flag 0表示 左递归 1表示右递归
void Merge( TreeNode *PRoot1,TreeNode *Root1, TreeNode *PRoot2, TreeNode *Root2 ,int Flag){
if( Root1 && Root2 ){
Root1->val += Root2->val ;
Merge( Root1,Root1->left ,Root2,Root2->left,0);
Merge( Root1,Root1->right ,Root2,Root2->right,1);
}else if( Root2 ){
if(Flag)
PRoot1->right = Root2 ;
else
PRoot1->left = Root2 ;
}
}
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if( root1 == NULL || root2 == NULL )
return root1?root1:root2 ;
root1->val += root2->val ;
Merge( root1, root1->left,root2,root2->left,0);
Merge( root1, root1->right,root2,root2->right,1);
return root1 ;
}
};
理解与评价:合并两个而叉树到左边的而叉树 从两颗根节点的左右节点开始遍历 记录两个左右节点的父节点(后面会用到)如果两个节点都不为空 则让左节点加上右节点的值 然后继续递归 如果左节点为空右节点不为空 直接让左节点的父节点指向右节点即可 如果右节点为空左节点不为空 或者左右节点均为空 不用处理 Flag记录处理的是左树还是右树
DFS2(44ms)
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if( root1 == NULL )
return root2 ;
if( root2 == NULL)
return root1 ;
TreeNode *Merge = new TreeNode(root1->val + root2->val);
Merge->left = mergeTrees(root1->left,root2->left);
Merge->right = mergeTrees(root1->right,root2->right);
return Merge ;
}
};