二叉排序树 (九度教程第 35 题)
时间限制:1 秒 内存限制:32 兆 特殊判题:否
时间限制:1 秒 内存限制:32 兆 特殊判题:否
1.题目描述:
输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。
输入:
输入第一行包括一个整数 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
提示:
输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。
2.基本思路
首先构造二叉排序树/二叉搜索树,每次向树中插入一个数值x只会存在以下三种情况,①当前的访问的结点为NULL,直接创建一个结点,并将x赋为该结点的值插入到树中。②x小于等于当前访问结点的值,递归当前结点的左子树。③x大于当前访问结点的值,递归当前结点的右子树。当所有的x插入完毕之后,二叉排序树便构建完毕,然后对其进行前序、中序和后序遍历即可。
3.代码实现
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
struct Node{
Node* lchild;
Node* rchild;
int c;
}Tree[50];
int loc=0;
Node* create(){//申请一个结点空间并进行初始化同时返回指向该结点的指针
Tree[loc].lchild = NULL;
Tree[loc].rchild = NULL;
loc++;
return &Tree[loc];
}
Node* insertANumber(Node* T,int x){//在以T为根结点的树中出入数字x
if(T==NULL){//若当前结点为空,创建一个结点并插入相应的数值
T = create();
T->c=x;
return T;
}
if(x<=T->c){//若x小于等于当前值,插入T的左子树
T->lchild = insertANumber(T->lchild,x);
}
if(x>T->c){//若x大于当前值,插入T的右子树
T->rchild = insertANumber(T->rchild,x);
}
return T;
}
void preOrder(Node *r){//二叉树的前序遍历
printf("%d ",r->c);
if(r->lchild!=NULL){//左子树不为了空遍历左子树
preOrder(r->lchild);
}
if(r->rchild!=NULL){//右子树不为空遍历右子树
preOrder(r->rchild);
}
}
void inOrder(Node *r){//二叉树的中序遍历
if(r->lchild!=NULL){//左子树不为了空遍历左子树
inOrder(r->lchild);
}
printf("%d ",r->c);
if(r->rchild!=NULL){//右子树不为空遍历右子树
inOrder(r->rchild);
}
}
void postOrder(Node *r){//二叉树的后序遍历
if(r->lchild!=NULL){//左子树不为了空遍历左子树
postOrder(r->lchild);
}
if(r->rchild!=NULL){//右子树不为空遍历右子树
postOrder(r->rchild);
}
printf("%d ",r->c);
}
int main()
{
int n;
int x;
while(scanf("%d",&n)!=EOF){
Node* T = NULL;
loc=0;//初始分配的空间为大小为0
for(int i=0;i<n;i++){
scanf("%d",&x);
T = insertANumber(T,x);
}
preOrder(T);
printf("\n");
inOrder(T);
printf("\n");
postOrder(T);
printf("\n");
}
return 0;
}
/*
5
1 6 5 9 8
9
1 9 8 2 3 8 4 7 6
*/