二叉排序树(牛客北邮机试题)//构造二叉排序树+先序中序后序遍历

题目描述

输入一系列整数,建立二叉排序树,并进行前序,中序,后序遍历。

输入描述:

输入第一行包括一个整数n(1<=n<=100)。
接下来的一行包括n个整数。

输出描述:

可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序、中序和后序遍历。
每种遍历结果输出一行。每行最后一个数据之后有一个空格。

输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。

示例1

输入

5
1 6 5 9 8

输出

1 6 5 9 8 
1 5 6 8 9 
5 8 9 6 1 

AC代码:

#include<bits/stdc++.h>
using namespace std;
struct Node
{
    int x;
    Node *l,*r;
};
void build(Node *t,int x)
{
    if(x<t->x)
    {
        if(t->l==NULL)
        {
            Node *n=new Node();
            n->x=x;
            n->l=NULL;
            n->r=NULL;
            t->l=n;
        }
        else build(t->l,x);
    }
    
    if(x>t->x)
    {
        if(t->r==NULL)
        {
            Node *n=new Node();
            n->x=x;
            n->l=NULL;
            n->r=NULL;
            t->r=n;
        }
        else build(t->r,x);
    }
    //cout<<1<<endl;
}
void pre(Node *n)
{
    printf("%d ",n->x);
    if(n->l!=NULL)pre(n->l);
    if(n->r!=NULL)pre(n->r);
}
void in(Node *n)
{
    
    if(n->l!=NULL)in(n->l);
    printf("%d ",n->x);
    if(n->r!=NULL)in(n->r);
}
void post(Node *n)
{
    
    if(n->l!=NULL)post(n->l);
    if(n->r!=NULL)post(n->r);
    printf("%d ",n->x);
}
int main()
{
    int n,i,j,x;
    while(~scanf("%d",&n))
    {
        Node *t;
        t=new Node();
        t->l=NULL;
        t->r=NULL;
        //memset(no,-1,sizeof(no));
        for(i=0;i<n;++i)
        {
            scanf("%d",&x);
            if(i==0)t->x=x;
            else
            {
                build(t,x);
            }
        }
        //cout<<1<<endl; 
        pre(t);
        printf("\n");
        in(t);
        printf("\n");
        post(t);
        printf("\n");
    }
}

优化后代码:

#include<bits/stdc++.h>
using namespace std;
struct Node
{
    int x;
    Node *l,*r;
};
Node *build(Node *t,int x)
{
    if(t==NULL)
    {
        Node *n=new Node();
        n->x=x;
        n->l=n->r=NULL;
        return n;
    }
	if(x<t->x)
    {
        
        t->l=build(t->l,x);
    }else if(x>t->x)
    {
        t->r=build(t->r,x);
    }
    //cout<<1<<endl;
}
void pre(Node *n)
{
    printf("%d ",n->x);
    if(n->l!=NULL)pre(n->l);
    if(n->r!=NULL)pre(n->r);
}
void in(Node *n)
{
    
    if(n->l!=NULL)in(n->l);
    printf("%d ",n->x);
    if(n->r!=NULL)in(n->r);
}
void post(Node *n)
{
    
    if(n->l!=NULL)post(n->l);
    if(n->r!=NULL)post(n->r);
    printf("%d ",n->x);
}
int main()
{
    int n,i,j,x;
    while(~scanf("%d",&n))
    {
        Node *t=NULL;
        for(i=0;i<n;++i)
        {
            scanf("%d",&x);
            t=build(t,x);
        }
        //cout<<1<<endl; 
        pre(t);
        printf("\n");
        in(t);
        printf("\n");
        post(t);
        printf("\n");
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值