小白书之二叉树指针法构建二叉树以及二叉树先序遍历

本文深入探讨了C++中模板的使用技巧及其与继承之间的交互作用,详细介绍了如何通过模板实现通用代码复用,同时阐述了在继承结构中如何灵活运用模板来简化类的设计与实现。

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

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<cctype>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#define LL __int64
using namespace std;
const double pi=4*atan(1.0);
const int MAXN=1001;
/*typedef struct TNode
{
    int have_value;
    int v;
    struct TNode *left,*right;
}Node;
Node *root;
Node* newnode()
{
    Node *u=(Node *)malloc(sizeof(Node));
    if(u!=NULL)
    {
        u->have_value=0;
        u->left=u->right=NULL;
    }
    return u;
}
int failed=0;
void addnode(int v,char *s)
{
   // cout<<"hehe"<<endl;
    int n=strlen(s);
    Node* u=root;
   // cout<<s<<endl;
    for(int i=0;i<n;i++)
    {
        if(s[i]=='L')
        {
            if(u->left==NULL)
                u->left=newnode();
            u=u->left;
        }
        else if(s[i]=='R')
        {
            if(u->right==NULL)
                u->right=newnode();
            u=u->right;
        }
     //   cout<<"hehe"<<endl;
    }
    if(u->have_value) failed=1;
    u->v=v;
    u->have_value=1;
}
char s[maxn+10];
int read_input()
{
    failed=0;
    root=newnode();
    for(;;)
    {
        if(scanf("%s",s)!=1) return 0;
        if(!strcmp(s,"()")) break;
        int v;
        sscanf(&s[1],"%d",&v);
        addnode(v,strchr(s,',')+1);
    }
    return 1;
}
int n=0,ans[maxn];
int bfs()
{
    int front=0,rear=1;
    Node *q[maxn];
    q[0]=root;
    while(front<rear)
    {
        Node *u=q[front++];
        if(!u->have_value) return 0;

        ans[n++]=u->v;
        if(u->left!=NULL) q[rear++]=u->left;
        if(u->right!=NULL) q[rear++]=u->right;
    }
    return 1;
}
void remove_tree(Node *u)
{
    if(u==NULL) return;
    remove_tree(u->left);
    remove_tree(u->right);
    free(u);
}
int main()
{
    while(read_input())
    {
      //  cout<<"hehe"<<endl;
        if(failed||!bfs())
        {
            cout<<-1<<endl;
        }
        else
        {
           for(int i=0;i<n;i++)
                cout<<ans[i]<<' ';
           cout<<endl;
        }
        remove_tree(root);
    }
    return 0;
}*/
int have_value[MAXN];
int v[MAXN];
int lleft[MAXN],rright[MAXN];
const int root=1;
int cnt;
int failed;
void newtree()
{
    lleft[root]=rright[root]=0;cnt=root;
}
int newnode()
{
    int u=++cnt;
    lleft[u]=rright[u]=0;
    return u;
}
void addnode(int t,char *s)
{
    int n=strlen(s);
    int u=root;
    for(int i=0;i<n;i++)
    {
        if(s[i]=='L')
        {
            if(!lleft[u])
            {
                lleft[u]=newnode();
            }
            u=lleft[u];
        }
        if(s[i]=='R')
        {
            if(!rright[u])
            {
                rright[u]=newnode();
            }
            u=rright[u];
        }
    }
    if(have_value[u]) failed=1;
    v[u]=t;
    have_value[u]=1;
}
char s[MAXN];
int read_input()
{
    newtree();
    memset(have_value,0,sizeof(have_value));
    failed=0;
    for(;;)
    {
        if(scanf("%s",s)!=1) return 0;
        if(!strcmp(s,"()")) break;
        int v;
        sscanf(&s[1],"%d",&v);
        addnode(v,strchr(s,',')+1);
    }
    return 1;
}
int n,ans[MAXN];
int bfs()
{
    n=0;
    int front=0,rear=1;
    int q[MAXN];
    q[0]=1;
    while(front<rear)
    {
        int u=q[front++];
     //   cout<<u<<endl;
        if(!have_value[u]) return 0;

        ans[n++]=v[u];
        if(lleft[u]) q[rear++]=lleft[u];
        if(rright[u]) q[rear++]=rright[u];
    }
    return 1;
}
int main()
{
    while(read_input())
    {
      //  for(int i=1;i<=cnt;i++)
       //     cout<<v[i]<<' ';
        if(failed||!bfs())
        {
            cout<<-1<<endl;
        }
        else
        {
            for(int i=0;i<n;i++)
                cout<<ans[i]<<' ';
            cout<<endl;
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值