/**傻逼题我还以为一个一个的连呢
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* @param t1 TreeNode类
* @param t2 TreeNode类
* @return TreeNode类
*/
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
// write code here
if(t1 == NULL) return t2;
if(t2 == NULL) return t1;
//新节点合并相同值
TreeNode *head = new TreeNode(t1->val + t2->val);
//同时递归遍历两颗树
head->left = mergeTrees(t1->left, t2->left);
head->right = mergeTrees(t1->right, t2->right);
return head;
}
};
算法思想:
- 使用递归的方式合并两棵二叉树。
- 如果两棵树中的对应节点都为空,则返回空。
- 如果其中一棵树的对应节点为空,则返回另一棵树的对应节点。
- 如果两棵树的对应节点都不为空,则创建一个新节点,值为两棵树对应节点的值之和,并递归合并左子树和右子树。
时间复杂度:
O(n),其中n是两棵二叉树中节点的个数较大的那棵树的节点个数。需要遍历每个节点一次。
空间复杂度:
O(n),递归调用栈的深度最大为较大的那棵树的高度,最坏情况下,两棵树都是链表,高度为n,因此空间复杂度是O(n)。

京公网安备 11010502036488号