二叉排序树[2005年华中科技大学计算机保研机试真题]

题目描述:
输入一系列整数,建立二叉排序树,并进行前序,中序,后序遍历。
输入:
输入第一行包括一个整数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
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;
}

本题在线测试入口

你可能感兴趣的:(机试)