2023.7.9
这题要求合并两二叉树,若节点重叠则将节点值相加。 和之前不同的是需要同时对两棵树进行操作,我选用队列来做这题。
大致思路:通过遍历两棵树的对应节点,将节点值相加并合并到第一棵树上。如果某个节点为空,直接将另一棵树的对应节点接到第一棵树上。最终返回合并后的第一棵树的根节点。
下面上代码:
方法一:队列迭代法
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if(root1 == nullptr) return root2;
if(root2 == nullptr) return root1;
queue<TreeNode*> que;
que.push(root1);
que.push(root2);
while(!que.empty())
{
TreeNode* node1 = que.front(); que.pop();
TreeNode* node2 = que.front(); que.pop();
//此时两节点肯定都不为空
node1->val += node2->val;
//两节点的左孩子都不为空
if(node1->left && node2->left)
{
que.push(node1->left);
que.push(node2->left);
}
//node1节点的左孩子为空,直接用node2的左孩子覆盖。
if(node1->left == nullptr) node1->left = node2->left;
//两节点的右孩子都不为空
if(node1->right && node2->right)
{
que.push(node1->right);
que.push(node2->right);
}
//node1节点的右孩子为空,直接用node2的右孩子覆盖。
if(node1->right == nullptr) node1->right = node2->right;
}
return root1;
}
};
再更新一下递归法:
方法二:递归法
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if(root1 == nullptr) return root2;
if(root2 == nullptr) return root1;
root1->val += root2->val;
root1->left = mergeTrees(root1->left,root2->left);
root1->right = mergeTrees(root1->right,root2->right);
return root1;
}
};