算法-二叉树:合并两颗二叉树
思路解析:
- 使用t1和t2节点同时遍历两棵树,将两颗树的每个根节点相加;
- 如果t1为空,那么合并之后就是t2;
- 如果t2为空,那么合并之后就是t1。
方法一:采用递归,下面程序使用前序遍历(前中后都可)。
TreeNode* plusTree(TreeNode* t1,TreeNode* t2){
if(t1 == NULL) return t2;
if(t2 == NULL) return t1;
//重新定义了一棵树,也可以不定义而是直接加到t1上
TreeNode *root = new TreeNode(t1->val+t2->val);
root->left = plusTree(t1->left, t2->left);
root->right = plusTree(t1->right, t2->right);
return root;
}
方法二:采用迭代法,在处理两棵树时使用迭代法一般使用层序遍历。
TreeNode* plusTree(TreeNode* t1,TreeNode* t2){
if(t1 == NULL) return t2;
if(t2 == NULL) return t1;
queue<TreeNode*> que;
que.push(t1);
que.push(t2);
//直接加到t1上比较简单,因为不用考虑t1不为空但t2为空的情况
while (!que.empty()) {
TreeNode* node1 = que.front();
que.pop();
TreeNode* node2 = que.front();
que.pop();
node1->val += node2->val;//node1、node2一定不为空,因为有空值的时候没有推入队列而是直接赋值了
//t1 t2左子树都不空
if(!node1->left && !node2->left){
que.push(node1->left);
que.push(node2->left);
}
//t1 t2右子树都不空
if(!node1->right && !node2->right){
que.push(node1->right);
que.push(node2->right);
}
//t1左子树为空,t2左不空
if(!node1->left && node2->left){
node1->left = node2->left;
}
//t1右子树为空,t2右不空
if(!node1->right && node2->right){
node1->right = node2->right;
}
}
return t1;
}