一、题目描述
二、输入与输出
1.输入
第一行输入t,表示有t个测试样例。
第二行起,每一行首先输入一个正整数n,接下来依次输入n个整数。
以此类推,共输入t个测试样例。
4
5 1 -1 2 3 4
7 1 2 2 3 4 4 3
7 1 2 2 -1 3 -1 3
7 1 2 -1 3 -1 4 -1
2.输出
每三行依次输出每个二叉树的前序、中序、后序遍历。
共输出t个二叉树。
注意输出末尾的空格。
1 2 3 4
1 3 2 4
3 4 2 1
1 2 3 4 2 4 3
3 2 4 1 4 2 3
3 4 2 4 3 2 1
1 2 3 2 3
2 3 1 2 3
3 2 3 2 1
1 2 3 4
4 3 2 1
4 3 2 1
三、参考代码
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
using namespace std;
class TreeNode
{
public:
TreeNode* lchild;
TreeNode* rchild;
TreeNode* parent;
int data;
TreeNode(){ lchild = NULL; rchild = NULL; parent = NULL; }
TreeNode(int num) { lchild = NULL; rchild = NULL; parent = NULL; data = num; }
};
class Tree
{
public:
TreeNode* root;
int *arr = new int [len];
int len;
Tree() {};
TreeNode* Make()
{
TreeNode* r;
queue<TreeNode*>q;
r = new TreeNode(arr[0]);
q.push(r);
int index = 1;
while (!q.empty() && index<len)
{
TreeNode* cur = q.front();
q.pop();
if (index < len && arr[index] != -1)
{
cur->lchild = new TreeNode(arr[index]);
q.push(cur->lchild);
}
index++;
if (index < len && arr[index] != -1)
{
cur->rchild = new TreeNode(arr[index]);
q.push(cur->rchild);
}
index++;
}
return r;
}
void MakeTree(int a[],int l)
{
len = l;
for (int i = 0; i < l; i++)
{
arr[i] = a[i];
}
root = Make();
}
void Prepri(TreeNode* r)
{
if (r)
{
cout << r->data << " ";
Prepri(r->lchild);
Prepri(r->rchild);
}
}
void Inpri(TreeNode* r)
{
if (r)
{
Inpri(r->lchild);
cout << r->data << " ";
Inpri(r->rchild);
}
}
void Pospri(TreeNode* r)
{
if (r)
{
Pospri(r->lchild);
Pospri(r->rchild);
cout << r->data << " ";
}
}
void pri()
{
Prepri(root);
cout << endl;
Inpri(root);
cout << endl;
Pospri(root);
cout << endl << endl;
}
};
int main()
{
int sum;
cin >> sum;
while (sum--)
{
int len;
int arr[1000];
cin >> len;
for (int i = 0; i < len; i++)
{
cin >> arr[i];
}
Tree t;
t.MakeTree(arr, len);
t.pri();
}
return 0;
}