题目:
- 给你两棵二叉树:
root1
和root2
。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。返回合并后的二叉树。注意: 合并过程必须从两个树的根节点开始。
示例:
- 输入: r o o t 1 = [ 1 , 3 , 2 , 5 ] , r o o t 2 = [ 2 , 1 , 3 , n u l l , 4 , n u l l , 7 ] root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7] root1=[1,3,2,5],root2=[2,1,3,null,4,null,7]
- 输出: [ 3 , 4 , 5 , 5 , 4 , n u l l , 7 ] [3,4,5,5,4,null,7] [3,4,5,5,4,null,7]
解题思路:(递归)
-
确定递归函数的参数和返回值:
由于是两个树的合并,因此传入的参数为两个树的根节点,返回合并后的二叉树的根节点。TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2)
-
确定终止条件:
如果root1
为NULL
则直接返回root2
,若root2
为NULL
则直接返回root1
。if(root1 == NULL) return root2; if(root2 == NULL) return root1;
-
确定单层循环逻辑:
若两棵树的节点都不空,则将两树节点值相加:root1->val += root2->val;
然后递归两棵树,分别从左侧和右侧来递归:
root1->left = mergeTrees(root1->left, root2->left); root1->right = mergeTrees(root1->right, root2->right);
C++版整体代码
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if(root1 == NULL) return root2;
if(root2 == NULL) return root1;
root1->val += root2->val;
root1->left = mergeTrees(root1->left, root2->left);
root1->right = mergeTrees(root1->right, root2->right);
return root1;
}
};