​BM32 合并二叉树​

描述

已知两颗二叉树,将它们合并成一颗二叉树。合并规则是:都存在的结点,就将结点值加起来,否则空的位置就由另一个树的结点来代替。例如:

两颗二叉树是:

                                                                    Tree 1[二叉树]BM32 合并二叉树-简单_二叉树合并


                                                                        Tree 2

[二叉树]BM32 合并二叉树-简单_二叉树_02

                                                                    合并后的树为

[二叉树]BM32 合并二叉树-简单_层次遍历_03数据范围:树上节点数量满足 [二叉树]BM32 合并二叉树-简单_递归_04,树上节点的值一定在32位整型范围内。进阶:空间复杂度 [二叉树]BM32 合并二叉树-简单_二叉树合并_05 ,时间复杂度 [二叉树]BM32 合并二叉树-简单_二叉树_06

示例1

输入:

{1,3,2,5},{2,1,3,#,4,#,7}

复制返回值:

{3,4,5,5,4,#,7}

复制说明:

如题面图

示例2

输入:

{1},{}

复制返回值:

{1}


题解

递归解法

使用前序遍历的方式对树进行合并,然后再分别对其左结点、右结点进行合并

#include <bits/stdc++.h>

// https://www.nowcoder.com/practice/7298353c24cc42e3bd5f0e0bd3d1d759?tpId=295&tags=&title=&difficulty=0&judgeStatus=0&rp=0&sourceUrl=%2Fexam%2Foj
struct TreeNode
{
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

TreeNode *mergeTrees(TreeNode *t1, TreeNode *t2)
{
if (t1 == nullptr)
{
return t2;
}

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

TreeNode *node = t1;
node->val = t1->val + t2->val;
auto left = mergeTrees(t1->left, t2->left);
auto right = mergeTrees(t1->right, t2->right);
node->left = left;
node->right = right;
return node;
}

非递归解法

非递归的解法还是借鉴了层次遍历,不同的是此时需要创建3个队列,q,q1,q2,其中q代表的是我们新建的队列,q1和q2则分别是另外2个队列。合并步骤如下:

  • 1. 如果q1或者q2为空,直接返回非空的节点
  • 2. 将q1和q2的根结点的值相加创建一个新的节点作为我们新的根结点
  • 3. 将创建的根结点放入队列q,然后将t1和t2分别放入q1和q2
  • 4. 从以上三个队列中取出队首元素并且记得出队,并且根据q1和q2队首元素的左右节点情况新建节点,然后和q队列队首元素的左右节点进行链接,分以下情况
  • a. 如果q1和q2的左结点都为空,则直接跳过左结点
  • b. 如果q1和q2的左结点都不为空,则使用他们左结点值之和创建一个新的节点,并且将q队列队首元素的左指针指向新建的节点,然后分别将这三个节点放入q,q1,q2
  • b. 如果q1和q2中有一个不为空,则直接以非空节点为根结点拷贝剩余的整个二叉树,然后将q队首元素的左指针指向新建的二叉树的根
  • 5. 右子树的操作同左子树

TreeNode *copy_tree(TreeNode *root)
{
if (root == nullptr)
{
return root;
}
auto node = new TreeNode(root->val);
node->left = copy_tree(root->left);
node->right = copy_tree(root->right);
return node;
}

TreeNode *mergeTrees(TreeNode *t1, TreeNode *t2)
{
if (t1 == nullptr)
{
return t2;
}
if (t2 == nullptr)
{
return t1;
}
std::queue<TreeNode *> q, q1, q2;
auto head = new TreeNode(t1->val + t2->val);
q.push(head);
q1.push(t1);
q2.push(t2);
while (!q1.empty() || !q2.empty())
{
auto node = q.front();
auto n1 = q1.front();
auto n2 = q2.front();
q.pop();
q1.pop();
q2.pop();
auto left1 = n1->left;
auto right1 = n1->right;
auto left2 = n2->left;
auto right2 = n2->right;
if (left1 != nullptr || left2 != nullptr)
{
if (left1 == nullptr)
{
node->left = copy_tree(left2);
}
else if (left2 == nullptr)
{
node->left = copy_tree(left1);
}
else
{
node->left = new TreeNode(left1->val + left2->val);
q.push(node->left);
q1.push(left1);
q2.push(left2);
}
}

if (right1 != nullptr || right2 != nullptr)
{
if (right1 == nullptr)
{
node->right = copy_tree(right2);
}
else if (right2 == nullptr)
{
node->right = copy_tree(right1);
}
else
{
node->right = new TreeNode(right1->val + right2->val);
q.push(node->right);
q1.push(right1);
q2.push(right2);
}
}
}
return head;
}