合并二叉树
题目链接:合并二叉树
解题思路1:递归+前序遍历
首先说一下为什么推荐用前序遍历,前序遍历是根左右的顺序,我们创建树,很好的方式是最先创建树根,再把左右节点往树上挂
其次为什么用递归呢?对于二叉树而言,每一个左右子树都可以看作是一棵完整的树,整体是树,部分也是树,很容易想要用递归的方式解决问题
我们同时遍历两棵二叉树,如果各自节点不为空,就将值相加,如果1树节点为空,就返回2树节点,如果2树节点为空,就返回1树节点,如果节点都为空,那就返回空节点了
代码如下:
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
if(t1 == nullptr) return t2;
if(t2 == nullptr) return t1;
//前序遍历
//创建根节点
TreeNode* head = new TreeNode(t1->val+t2->val);
//进入左子树
head->left = mergeTrees(t1->left, t2->left);
//进入右子树
head->right = mergeTrees(t1->right, t2->right);
return head;
}
解题思路2:队列+层次遍历
我们创建三个队列,q,q1,q2,分别保存合并后的节点,以及两棵被合并树的节点,采用队列实现层次遍历,来创建新树
代码如下:
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
if(t1 == nullptr) return t2;
if(t2 == nullptr) return t1;
queue<TreeNode*> q;//保存合并后的节点
queue<TreeNode*> q1;
queue<TreeNode*> q2;
//合并根节点
TreeNode* head = new TreeNode(t1->val+t2->val);
q.push(head);
q1.push(t1);
q2.push(t2);
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;
TreeNode* right1 = node1->right, *right2 = node2->right;
if(left1!=nullptr || left2!=nullptr){
if(left1!=nullptr && left2!=nullptr){
TreeNode* left = new TreeNode(left1->val + left2->val);
node->left = left;
//新节点入队列
q.push(left);
q1.push(left1);
q2.push(left2);
}else if(left1!=nullptr){
node->left = left1;
}else if(left2!=nullptr){
node->left = left2;
}
}
if(right1!=nullptr || right2!=nullptr){
if(right1!=nullptr && right2!=nullptr){
TreeNode* right = new TreeNode(right1->val+right2->val);
node->right = right;
q.push(right);
q1.push(right1);
q2.push(right2);
}else if(right1!=nullptr){
node->right = right1;
}else {
node->right = right2;
}
}
}
return head;
}