问题 L: 二叉查找树(Ⅰ)-创建和遍历

前言必读!http://blog.csdn.net/hnust_v/article/details/51747743
问题 L: 二叉查找树(Ⅰ)-创建和遍历
时间限制: 1 Sec 内存限制: 128 MB
提交: 415 解决: 91
[提交][状态][讨论版]
题目描述

二叉查找树(Binary Search Tree),又称为二叉排序树,它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉查找树。

 本任务是在空树的基础上,依次插入一些关键字,然后遍历该树。要求树中不能有重复关键字。

输入

由多组数据 组成。

每组数据由两行组成。第一行是待插入关键字的数目n(1<=n<=100)。第2行是n个空格分开的正整数,值不超过100。

输出

 对于每一组数据,输出两行。第一行是该BST的中序遍历,第二行是该BST的后序遍历,各关键字用空格分隔。
样例输入
6
4 2 1 5 3 6
样例输出
1 2 3 4 5 6
1 3 2 6 5 4
提示

递归建树,递归打印,任何一本数据结构书都有伪代码,这里不贴了

#include <bits/stdc++.h>
using namespace std;
typedef struct LNode
{
    LNode *Lchild,*Rchild;
    int info,flor;
}LNode,*Fin;
LNode Q[10000];
int ERRZ[10000],ERRH[10000];
int Z,H,Count;
void PrintZ(Fin P,int n)
{

    if(P==NULL) return;
    PrintZ(P->Lchild,n);
    printf("%d%c",P->info,++Z!=n?' ':'\n');
    PrintZ(P->Rchild,n);
}
void PrintH(Fin P,int n)
{
    if(P==NULL) return;
    PrintH(P->Lchild,n);
    PrintH(P->Rchild,n);
    printf("%d%c",P->info,++H!=n?' ':'\n');
}
void Add(int a,int FLOR,LNode *P,LNode *Q)
{
   // if(P.Lchild) printf("P==%d (*P.Lchild).info==%d\n",P.info,(*P.Lchild).info);
    Q->flor=FLOR;
    if(P->info > a)
    {
        if(P->Lchild != NULL) Add(a,FLOR+1,P->Lchild,Q);
        else {P->Lchild = Q;return;}
    }
    else if(P->info < a)
    {
        if(P->Rchild != NULL) Add(a,FLOR+1,P->Rchild,Q);
        else {P->Rchild = Q;return;}
    }
    else if(P->info == a)  {Count++;return;}
    return;
}
void Creat(int n)
{
    Fin Root=NULL;
    int a;LNode P;Count=0;
    scanf("%d",&a);
    P.info=a;P.flor=0;P.Lchild=P.Rchild=NULL;//Print(&P);
    Root = &P;
    for(int i=2,a;i<=n;i++)
    {
        scanf("%d",&a);
        Q[i].info=a;Q[i].Lchild=Q[i].Rchild=NULL;
       // P = *Root;
        //printf("i==%d_ a==%d_______________________________\n",i,a);
       // printf("P.info==%d\n",P.info);
        //if(P.Lchild) printf("P==%d (*P.Lchild).info==%d\n",P.info,(*P.Lchild).info);
        Add(a,1,&P,&Q[i]); //Print(Root);
    }
    Z=0;H=0;PrintZ(Root,n-Count);PrintH(Root,n-Count);
}
int main()
{
  //  freopen("F:\\test.txt","r",stdin);
  //  freopen("F:\\tsst.txt","w",stdout);
    int n;while(cin>>n) Creat(n);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值