本题源自leetcode 617
----------------------------------------------------------------
思路:
1 递归: 先合并根节点。在递归合并左子树和右子树。
2 非递归: 用俩个栈保存节点。先将根节点都入栈。然后每次弹出节点合并。判断弹出的节点是否有左右子树。对子树进行合并。本题将第二棵树的节点合并到第一棵树上。
代码:
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
/*
if(t1==NULL)
return t2;
if(t2==NULL)
return t1;
TreeNode* root=new TreeNode(t1->val + t2->val);
root->left=mergeTrees(t1->left,t2->left);
root->right=mergeTrees(t1->right,t2->right);
return root;*/
if(t1==NULL)
return t2;
if(t2==NULL)
return t1;
TreeNode* res=t1;
stack<TreeNode*> s1,s2;
s1.push(t1);
s2.push(t2);
while(s1.size()){
TreeNode* p=s1.top();
s1.pop();
TreeNode* q=s2.top();
s2.pop();
p->val += q->val;
if(p->left==NULL&&q->left!=NULL)
p->left=q->left;
else if(p->left && q->left){
s1.push(p->left);
s2.push(q->left);
}
if(p->right==NULL && q->right)
p->right=q->right;
else if(p->right && q->right){
s1.push(p->right);
s2.push(q->right);
}
}
return res;
}