算法期中练习——1002. 合并二叉树
Description:
输入两个二叉树T1和T2,要求对T1和T2进行合并. 合并是指将二叉树同一位置节点上的数求和,作为合并后二叉树相应位置节点的数值. 如果某个位置上只有一个二叉树有节点,则合并后的二叉树对应位置上的节点上的数值就等于这个节点上的数值.
Example:
例如:
T1 T2
1 2
/ \ / \
3 2 1 3
/ \ \
5 4 7
合并后:
3 / \ 4 5 / \ \ 5 4 7
T1和T2的结点数均不多于100000,每个结点的数值在1和1000之间.
请为下面的Solution类实现解决上述问题的merge函数,函数的两个参数T1和T2分别代表两个二叉树的根节点,函数返回值为合并后的二叉树的根节点.
/**
Definition for a binary tree node.
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
*/
class Solution {
public:
TreeNode* merge(TreeNode* T1, TreeNode* T2) {
}
};
分析:
可以构造一个新树,将原先两棵树的结点的值相加作为新树的结点的值,然后递归左右子树,递归函数的参数为左子树对应左子树、右子树对应右子树,当结点为空返回NULL。
代码如下:
/**
Definition for a binary tree node.
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
*/
class Solution {
public:
TreeNode* merge(TreeNode* T1, TreeNode* T2) {
if(T1 == NULL) return T2;
if(T2 == NULL) return T1;
T1->val += T2->val;
T1->left = merge(T1->left, T2->left);
T1->right = merge(T1->right, T2->right);
return T1;
}
};
// another solution
class Solution {
public:
TreeNode* merge(TreeNode* T1, TreeNode* T2) {
if (!T1 && !T2) return NULL;
if (!T1) return T2;
if (!T2) return T1;
TreeNode* T = new TreeNode(T1->val + T2->val);
T->left = merge(T1->left, T2->left);
T->right = merge(T1->right, T2->right);
return T;
}
};