DS二叉树_伪层序遍历构建二叉树
Description
给定一个用于表示二叉树的一维数组,该数组长度为n。该数组是按照一种类似于层序遍历的方式表示二叉树的,用数字-1表示某个结点为空。
根据给定的一维数组,构建二叉树并依次输出该二叉树的前序、中序、后序遍历。
Input
第一行输入t,表示有t个测试样例。
第二行起,每一行首先输入一个正整数n,接下来依次输入n个整数。
以此类推,共输入t个测试样例。
Output
每三行依次输出每个二叉树的前序、中序、后序遍历。
共输出t个二叉树。
Sample
in
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
out
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
Code
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
class Node//结点
{
public:
int data;
Node* Lchild;
Node* Rchild;
Node(int y)
{
data = y;
Lchild = NULL;
Rchild = NULL;
}
~Node()
{
delete Lchild;
delete Rchild;
}
};
Node* Build_Level(int *a,int num)
{
Node* ROOT=NULL;//待会要把根节点返回
queue<Node*> q;
int k = 0;
int ch;
ch = a[k];
k++;
if (ch != -1)
{
Node* root = new Node(ch);
ROOT = root;
q.push(root);
}
while (!q.empty()&&k<num)
{
Node* s = q.front();
ch = a[k];
//不可以把k++写在这个位置
if (ch != -1&&k<num)
{
//Create_Node(s->Lchild, x);
Node* news = new Node(ch);
s->Lchild = news;
q.push(news);
}
k++;
ch = a[k];
//不可以把k++写在这个位置
if (ch != -1&&k<num)
{
//Create_Node(s->Rchild, x);
Node* news = new Node(ch);
s->Rchild = news;
q.push(news);
}
k++;
q.pop();
}
return ROOT;
}
//
void PreOrder(Node* T)//前序
{
if (T)
{
cout << T->data << " ";
PreOrder(T->Lchild);
PreOrder(T->Rchild);
}
}
void MidOrder(Node* T)//中序
{
if (T)
{
MidOrder(T->Lchild);
cout << T->data << " ";
MidOrder(T->Rchild);
}
}
void RearOrder(Node* T)//后序
{
if (T)
{
RearOrder(T->Lchild);
RearOrder(T->Rchild);
cout << T->data << " ";
}
}
int main()
{
int t;
int sum;
cin >> t;
while (t--)
{
cin >> sum;
int* array = new int[sum];
for (int i = 0; i < sum; i++)
{
cin >> array[i];
}
Node *p= Build_Level(array,sum);//p为根节点
PreOrder(p);
cout << endl;
MidOrder(p);
cout << endl;
RearOrder(p);
cout << endl;
cout << endl;
}
return 0;
}