题目描述:
输入一系列整数,建立二叉排序树,并进行前序,中序,后序遍历。
输入:
输入第一行包括一个整数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
提示:
输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。
来源:
2005年华中科技大学计算机保研机试真题
解题思路: 一下子复习了三种遍历树方式, 和二叉搜索树的建立。
#include<bits/stdc++.h>
using namespace std;
struct Node{
Node* lchild;
Node* rchild;
int data;
}Tree[101];
int loc;
Node *creat(){
Tree[loc].lchild = Tree[loc].rchild = NULL;
return &Tree[loc++];
}
void postOrder(Node *T){//后序
if(T->lchild) postOrder(T->lchild);
if(T->rchild) postOrder(T->rchild);
cout << T->data << ' ';
}
void inOrder(Node *T){//中序
if(T->lchild) inOrder(T->lchild);
cout << T->data << ' ';
if(T->rchild) inOrder(T->rchild);
}
void preOrder(Node *T){//前序
cout << T->data << ' ';
if(T->lchild) preOrder(T->lchild);
if(T->rchild) preOrder(T->rchild);
}
Node *Insert(Node *T, int x){
if(T==NULL){
T = creat();
T->data = x;//插入结点内容
return T;
}
else if(x<T->data) T->lchild = Insert(T->lchild,x);//插入到左子树
else if(x>T->data) T->rchild = Insert(T->rchild,x);//插入到右子树
return T;
}
int main(){
int n;
while(scanf("%d", &n)!=EOF){
loc = 0;
Node *T = NULL;//二叉树根结点为空;
for(int i=0; i<n; i++){
int x;
cin >> x;
T = Insert(T,x);//插入到排序树中
}
preOrder(T);
cout << endl;
inOrder(T);
cout << endl;
postOrder(T);
cout << endl;
}
return 0;
}