代码解决
/** * 二叉树节点的定义。 * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) { // 若root1为空,则返回root2 if(root1 == nullptr) return root2; // 若root2为空,则返回root1 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 != nullptr && node2->left != nullptr) { // 将左子节点入队 que.push(node1->left); que.push(node2->left); } // 若两节点都有右子节点 if(node1->right != nullptr && node2->right != nullptr) { // 将右子节点入队 que.push(node1->right); que.push(node2->right); } // 若node1无左子节点但node2有,则将node2的左子节点赋给node1 if(node1->left == nullptr && node2->left != nullptr) { node1->left = node2->left; } // 若node1无右子节点但node2有,则将node2的右子节点赋给node1 if(node1->right == nullptr && node2->right != nullptr) { node1->right = node2->right; } } // 返回合并后的树(root1) return root1; } };
- 首先判断两棵树的根节点是否都为空,如果其中一棵为空,则返回另一棵。
- 初始化一个队列
que
用来存储两棵树的节点。- 将两棵树的根节点加入队列。
- 当队列不为空时,进行遍历:
- 从队列中取出两个节点,分别代表两棵树中的对应节点。
- 将这两个节点的值相加。
- 如果这两个节点都有左子节点,将左子节点加入队列。
- 如果这两个节点都有右子节点,将右子节点加入队列。
- 如果第一个节点有左子节点而第二个节点没有,将第一个节点的左子节点赋给第一个节点。
- 如果第一个节点有右子节点而第二个节点没有,将第一个节点的右子节点赋给第一个节点。
- 遍历结束后,返回第一棵树的根节点。
递归
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2)
{
// 如果root1为空,则返回root2
if(root1==nullptr) return root2;
// 如果root2为空,则返回root1
if(root2==nullptr) return root1;
// 创建一个新节点,值为两个根节点值的和
TreeNode* node=new TreeNode(0);
node->val=root1->val+root2->val;
// 递归合并左子树
node->left=mergeTrees(root1->left,root2->left);
// 递归合并右子树
node->right=mergeTrees(root1->right,root2->right);
// 返回合并后的根节点
return node;
}
};
- 首先判断两棵树的根节点是否为空,如果其中一个为空,则返回另一个。
- 创建一个新的树节点
node
,其值为两棵原树的根节点值之和。 - 递归地合并两棵原树的左子树,并将合并后的节点作为新节点的左子节点。
- 递归地合并两棵原树的右子树,并将合并后的节点作为新节点的右子节点。
- 返回合并后的根节点。
这个算法的时间复杂度是 O(n),因为每个节点都会被访问一次,其中 n 是两棵树中节点数量的总和。空间复杂度也是 O(n),因为需要存储递归调用的栈。