二叉排序树

博客围绕二叉排序树展开,要求输入一系列整数建立二叉排序树,并对其进行前序、中序和后序遍历。给出了输入输出格式及样例,每组数据的每种遍历结果输出一行,每行最后一个数据后有空格。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

输入

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

输出

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

样例输入

1
2
2
8 15
4
21 10 5 39

样例输出

2
2
2
8 15
8 15
15 8
21 10 5 39
5 10 21 39
5 10 39 21

瞎搞的。。。
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define ll long long
#define INF -72340172838076674
using namespace std;
ll n;
struct E{
    ll num,lson,rson;
}e[120];
ll cnt=0,root=INF;
ll find(ll x){
    x=e[x].num;
    ll cur=root;
    while(1){
        if(x<e[cur].num){
            if(e[cur].lson==INF){
                return cur;
            }
            else{
                cur=e[cur].lson;
            }
        }
        else if(x>e[cur].num){
            if(e[cur].rson==INF){
                return cur;
            }
            else{
                cur=e[cur].rson;
            }
        }
        else return INF;
    }
}
void Insert(ll x){
    if(!cnt){
        cnt++;
        root=x;
        return; 
    }
    ll fat=find(x);
    if(fat==INF) return;
    cnt++;
    if(e[x].num>e[fat].num){
        e[fat].rson=x;
    }
    else{
        e[fat].lson=x;
    }
    return;
}
void dfs1(ll x){
    if(x==INF) return;
    cout<<e[x].num<<' ';
    dfs1(e[x].lson);
    dfs1(e[x].rson);
}
void dfs2(ll x){
    if(x==INF) return;
    dfs2(e[x].lson);
    cout<<e[x].num<<' ';
    dfs2(e[x].rson);
}
void dfs3(ll x){
    if(x==INF) return;
    dfs3(e[x].lson);
    dfs3(e[x].rson);
    cout<<e[x].num<<' ';
}
int main(){
    while(cin>>n){
        root=INF,cnt=0;
        memset(e,-0x2,sizeof(e));
        for(int i=1;i<=n;i++){
            ll x;
            cin>>x;
            e[i].num=x;
            Insert(i);
        }
        dfs1(root);
        cout<<endl;
        dfs2(root);
        cout<<endl;
        dfs3(root);
        cout<<endl;
    }
     
    return 0;
}

转载于:https://www.cnblogs.com/sz-wcc/p/11071945.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值