http://ac.jobdu.com/problem.php?pid=1201
-
题目描述:
-
输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。
-
输入:
-
输入第一行包括一个整数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<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<fstream>
using namespace std;
typedef struct BiTNode //二叉树的链式存储定义
{
int key;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
int BST_Insert(BiTree &T, int key) //二叉排序树的插入
{
if (T == NULL)
{
T = new BiTNode;
T->key = key;
T->lchild = NULL;
T->rchild = NULL;
return 1;
}
else if (T->key == key) return 0; //忽略输入相同的元素
else if (T->key < key) return BST_Insert(T->rchild, key); //元素比根大,插入到右子树中
else if (T->key > key) return BST_Insert(T->lchild, key); //元素比根小,插入到左子树中
}
void Creat_BST(BiTree &T, int num[], int n) //建立二叉排序树
{
T = NULL;//初始时BT为空树
for (int i = 0; i < n; i++)
BST_Insert(T, num[i]);
}
void PreOrder(BiTree T)
{
if (T != NULL)
{
cout << T->key << " ";
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
void InOrder(BiTree T)
{
if (T != NULL)
{
InOrder(T->lchild);
cout << T->key << " ";
InOrder(T->rchild);
}
}
void PostOrder(BiTree T)
{
if (T != NULL)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
cout << T->key << " ";
}
}
int main()
{
int n, deep;
ifstream cin("data.txt");
while (cin>>n)
{
int *num = new int[n];
for (int i = 0; i < n; i++)
cin >> num[i];
BiTNode *T = new BiTNode;
Creat_BST(T, num, n); //建立二叉排序树
//分别以前序、中序、后序输出二叉树
PreOrder(T);
cout << endl;
InOrder(T);
cout << endl;
PostOrder(T);
cout << endl;
}
system("pause");
return 0;
}