/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * @author Senky
 * @date 2023.08.01
 * @par url https://www.nowcoder.com/creation/manager/content/584337070?type=column&status=-1
 * @brief 
 * 时间复杂度O(n)空间复杂度O(n) :
 *      如果两颗树的当前节点均存在,那么将它们的值相加,并递归合并左子树和右子树。
 *      如果一颗树的节点为空,而另一颗树的节点不为空,那么将非空树的节点作为合并后树的节点。
 *      如果两颗树的节点均为空,那么直接返回空节点。
 * 时间复杂度O(n)空间复杂度O(1) :
 *      在这个问题中,我们可以将其中一棵树作为参照,然后将另一棵树上缺少的节点添加到参照树上,而不需要创建新的节点。
 *      如果参照树节点不为空,而另一棵树节点为空,则将参照树节点保留不变,因为它是合并后的结果。
 *      如果参照树节点为空,而另一棵树节点不为空,则将参照树节点用另一棵树节点替换,因为它是合并后的结果。
 *      如果参照树节点和另一棵树节点均不为空,则将它们的值相加,并递归合并它们的左子树和右子树。
 * @param t1 TreeNode类 
 * @param t2 TreeNode类 
 * @return TreeNode类
 */
#include <stdlib.h>
struct TreeNode* mergeTrees(struct TreeNode* t1, struct TreeNode* t2 ) {
    // write code here
    if(NULL == t1)
    {
        return t2;
    }

    if(NULL ==t2)
    {
        return t1;
    }

    //由于这里会递归调用,而且生成的结点自动会将数据域和左右指针域赋正确的值
    struct TreeNode* MergeTree = (struct TreeNode*)malloc(sizeof(struct TreeNode));

    MergeTree->val = t1->val + t2->val;
    MergeTree->left = mergeTrees(t1->left, t2->left);
    MergeTree->right = mergeTrees(t1->right, t2->right);

    return MergeTree;
}
/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * @author Senky
 * @date 2023.08.01
 * @par url https://www.nowcoder.com/creation/manager/content/584337070?type=column&status=-1
 * @brief 
 * 时间复杂度O(n)空间复杂度O(n) :
 *      如果两颗树的当前节点均存在,那么将它们的值相加,并递归合并左子树和右子树。
 *      如果一颗树的节点为空,而另一颗树的节点不为空,那么将非空树的节点作为合并后树的节点。
 *      如果两颗树的节点均为空,那么直接返回空节点。
 * 时间复杂度O(n)空间复杂度O(1) :
 *      在这个问题中,我们可以将其中一棵树作为参照,然后将另一棵树上缺少的节点添加到参照树上,而不需要创建新的节点。
 *      如果参照树节点不为空,而另一棵树节点为空,则将参照树节点保留不变,因为它是合并后的结果。
 *      如果参照树节点为空,而另一棵树节点不为空,则将参照树节点用另一棵树节点替换,因为它是合并后的结果。
 *      如果参照树节点和另一棵树节点均不为空,则将它们的值相加,并递归合并它们的左子树和右子树。
 * @param t1 TreeNode类 
 * @param t2 TreeNode类 
 * @return TreeNode类
 */
#include <stdlib.h>
struct TreeNode* mergeTrees(struct TreeNode* t1, struct TreeNode* t2) {
    if (t1 == NULL) {
        return t2;
    }
    if (t2 == NULL) {
        return t1;
    }

    t1->val += t2->val;
    t1->left = mergeTrees(t1->left, t2->left);
    t1->right = mergeTrees(t1->right, t2->right);

    return t1;
}