* struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param t1 TreeNode类 
     * @param t2 TreeNode类 
     * @return TreeNode类
     */
    TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
        // write code here
        if(!t1)
            return t2;
        if(!t2)
            return t1;
        queue<TreeNode *>q1,q2,q;
        TreeNode* head=new TreeNode(t1->val+t2->val);
        q1.push(t1);
        q2.push(t2);
        q.push(head);
        while(!q1.empty()&&!q2.empty()){
            TreeNode* node=q.front();
            TreeNode* node1=q1.front();
            TreeNode* node2=q2.front();
            q.pop(),q1.pop(),q2.pop();
            TreeNode *left1=node1->left,*left2=node2->left,*right1=node1->right,*right2=node2->right;
            if(left1||left2){
                if(left1&&left2){
                    TreeNode* left=new TreeNode(left1->val+left2->val);
                    node->left=left;
                    q.push(node->left);
                    q1.push(left1);
                    q2.push(left2);
                }
                else if(left1)
                    node->left=left1;
                else if(left2)
                    node->left=left2;
            }
            if(right1||right2){
                if(right1&&right2){
                    TreeNode* right=new TreeNode(right1->val+right2->val);
                    node->right=right;
                    q.push(node->right);
                    q1.push(right1);
                    q2.push(right2);
                }
                else if(right1)
                    node->right=right1;
                else if(right2)
                    node->right=right2;
            }
        }
        return head;
    }
};