题目描述
输入描述:
输入第一行包括一个整数n(1<=n<=100)。 接下来的一行包括n个整数。
输出描述:
可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序、中序和后序遍历。 每种遍历结果输出一行。每行最后一个数据之后有一个空格。 输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。
输入
5 1 6 5 9 8
输出
1 6 5 9 8 1 5 6 8 9 5 8 9 6 1
此题主要是建立一个二叉排序树,并进行前序、中序、后序遍历。单独本身不大,主要是我自己对树和图的构造并不熟悉,借鉴了别人的答案,也依次做个记录。
期中在插入和遍历的过程中,都是用了递归的思想。
先构造一个树根,插入数据时,将数据与树根大小比较,如果较小且树根左子树为空,则为左子树新建一个节点;如果左子树不为空,则递归调用插入,将左子树作为该插入函数的树根。右子树同理。
代码:
#include <iostream>
using namespace std;
class Node
{
public:
int data;
Node *LChild;
Node *RChild;
Node(int a_data)
{
this->data = a_data;
LChild=NULL;
RChild=NULL;
}
};
void Insert(int var,Node *root)
{
if(var == root->data)
return ;
else if(var < root->data)
{
if(root->LChild == NULL)
root->LChild = new Node(var);
else
Insert(var,root->LChild);
}
else
{
if(root->RChild == NULL)
root->RChild = new Node(var);
else
Insert(var,root->RChild);
}
}
void preOrder( Node *root)
{
if(root == NULL) return ;
cout<<root->data<<" ";
preOrder(root->LChild);
preOrder(root->RChild);
}
void inOrder(Node *root)
{
if(root == NULL) return ;
inOrder(root->LChild);
cout<<root->data<<" ";
inOrder(root->RChild);
}
void postOrder(Node *root)
{
if(root == NULL) return ;
postOrder(root->LChild);
postOrder(root->RChild);
cout<<root->data<<" ";
}
int main()
{
int n,i;
int temp;
while(1)
{
if(!(cin>>n))
break;
cin>>temp;
Node *root = new Node(temp);
for(i=0;i<n-1;i++)
{
cin>>temp;
Insert(temp,root);
}
preOrder(root);cout<<endl;
inOrder(root);cout<<endl;
postOrder(root);cout<<endl;
}
return 0;
}