代码解决
/*** 二叉树节点的定义。* 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为空,则返回root2if(root1 == nullptr) return root2;// 若root2为空,则返回root1if(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的左子节点赋给node1if(node1->left == nullptr && node2->left != nullptr) {node1->left = node2->left;}// 若node1无右子节点但node2有,则将node2的右子节点赋给node1if(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为空,则返回root2if(root1==nullptr) return root2;// 如果root2为空,则返回root1if(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),因为需要存储递归调用的栈。