1.题目描述
给定两个二叉树,输出这两个二叉树合并后形成的二叉树,依次输出前序遍历、中序遍历、后序遍历。
输入:
第一行输入t,表示有t个测试样例。
第二行首先输入n1,接着输入n1个整数,用于代表二叉树tree1。
第三行首先输入n2,接着输入n2个整数,用于代表二叉树tree2。
以此类推,每两行输入一个测试样例的两个二叉树。
共输入t个测试样例。
数组形式的二叉树表示方法与题目:DS二叉树_伪层序遍历构建二叉树 相同,输入-1表示空结点。
输出:
每三行依次输出合并后的二叉树的前序遍历、中序遍历、后序遍历。
共输出t个二叉树。
2.题目分析
题目比较简单,思路的话可以直接照搬题目给的图示,我们同时遍历两棵树的左节点,右节点,保证遍历到了同一个位置,如果两个位置都是空的,返回,一个空一个不空就拿不空的那个值赋进去
3.代码
#include<iostream>
#include<queue>
using namespace std;
struct Node
{
int data;
Node* left = NULL;
Node* right = NULL;
};
class Tree
{
private:
Node* root;
public:
Tree();
void Seqcreation(Node*& node, int length);//层序遍历构建二叉树
void Treeadd(Node*& tree, Node* tree1, Node* tree2);//对树1树2同时同位置遍历
void AddCreation(Tree& tree2);//输出
void Preorder(Node* node);//先序遍历输出
void Inorder(Node* node);//中序遍历输出
void Postorder(Node* node);//后序遍历输出
};
Tree::Tree()
{
int leng;
cin >> leng;
Seqcreation(root, leng);
}
void Tree::Seqcreation(Node*& node, int length)
{
int val, i = 0;
queue<Node*> q;
Node* temp;
while (i < length)
{
cin >> val;
if (i == 0)
{
node = new Node;
node->data = val;
i++;
q.push(node);
continue;
}
temp = q.front();
if (val == -1)
{
if(i % 2 == 1)
temp->left = NULL;
if (i % 2 == 0)
{
temp->right = NULL;
q.pop();
}
i++;
}
else
{
Node* treenode = new Node;
treenode->data = val;
if (i % 2 == 1)
temp->left = treenode;
if (i % 2 == 0)
{
temp->right = treenode;
q.pop();
}
i++;
q.push(treenode);
}
}
}
void Tree::Treeadd(Node*& tree, Node* tree1, Node* tree2)
{
if (tree1 == NULL || tree2 == NULL)
{
if (tree1 == NULL && tree2 == NULL) return;//同时为空
if (tree1 == NULL && tree2 != NULL)//一个空,一个不空
{
tree = new Node;
tree->data = tree2->data;
Treeadd(tree->left, nullptr, tree2->left);//下一层空的那个用空指针代替
Treeadd(tree->right, nullptr, tree2->right);
}
if (tree1 != NULL && tree2 == NULL)//与上同理
{
tree = new Node;
tree->data = tree1->data;
Treeadd(tree->left, tree1->left, nullptr);
Treeadd(tree->right, tree1->right, nullptr);
}
}
else//两个都不是空的
{
tree = new Node;
tree->data = tree1->data + tree2->data;
Treeadd(tree->left, tree1->left, tree2->left);
Treeadd(tree->right, tree1->right, tree2->right);
}
}
void Tree::AddCreation(Tree& tree2)//输出
{
Node* node;
Treeadd(node, root, tree2.root);
Preorder(node); cout << endl;
Inorder(node); cout << endl;
Postorder(node); cout << endl;
cout << endl;
}
void Tree::Preorder(Node* node)
{
if (node)
{
cout << node->data << " ";
Preorder(node->left);
Preorder(node->right);
}
}
void Tree::Inorder(Node* node)
{
if (node)
{
Inorder(node->left);
cout << node->data << " ";
Inorder(node->right);
}
}
void Tree::Postorder(Node* node)
{
if (node)
{
Postorder(node->left);
Postorder(node->right);
cout << node->data << " ";
}
}
int main(void)
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
Tree tree1;
Tree tree2;
tree1.AddCreation(tree2);
}
return 0;
}