pta团体设计程序竞赛 L2这是二叉搜索树吗 已经成功ac 没有难度 只要了解BST的性质以及镜像树的遍历方法

https://pintia.cn/problem-sets/994805046380707840/problems/994805070971912192

#include <bits/stdc++.h>
using namespace std;
struct Tnode
{
    int data;
    struct Tnode *left;
    struct Tnode *right;

};
vector<int >pre;//前序
vector<int>pre_;//镜像
vector<int>v;//初始序列
vector<int>post;//后序遍历
vector<int>post_;
typedef struct Tnode* Btree;//指针
void preorder(Btree root)
{
   if(root==NULL)
       return ;
   else
   {
       pre.push_back(root->data);
       preorder(root->left);
       preorder(root->right);
   }

}
void preorder_(Btree root)//镜像术的遍历
{
    if(root==NULL)
       return ;
   else
   {
       pre_.push_back(root->data);
       preorder_(root->right);
       preorder_(root->left);
   }

}
void postorder(Btree root)
{
     if(!root)
       return ;
     else
     {
         postorder(root->left);
         postorder(root->right);
         post.push_back(root->data);

     }

}
void postorder_(Btree root)
{
     if(!root)
       return ;
     else
     {
         postorder_(root->right);
         postorder_(root->left);
         post_.push_back(root->data);

     }

}
void  Insert(Btree &root,int x)//递归找到空位置就可以插入
{
     if(root==NULL)
     {
        root=new struct Tnode;
        root->data=x;
        root->left=NULL;
        root->right=NULL;
        return;
     }
     else if(x<root->data)
     {
          Insert(root->left,x);

     }
     else if(x>=root->data)
     {

       Insert(root->right,x);
     }

}
int main()
{
   int n;
   int num;
   cin>>n;
   Btree root=NULL;//如果不赋值 那么一进去指针就是随机指向
   for(int i=0;i<n;++i)
   {
       cin>>num;
       v.push_back(num);
       Insert(root,num);
   }
   preorder(root);
   preorder_(root);
   postorder(root);
   postorder_(root);
   int flag1=0,flag2=0;

   for(int i=0;i<v.size();++i)
   {
        if(v[i]!=pre[i])
        {
            flag1=1;
            break;

        }

   }
     for(int i=0;i<v.size();++i)
   {
        if(v[i]!=pre_[i])
        {
             flag2=1;
             break;

        }

   }


   if(flag2==1&&flag1==1)
   {
       cout<<"NO";

   }
   else
   {
       if(flag1==0)
       {
            cout<<"YES"<<endl;
           cout<<post[0];
           for(int i=1;i<post.size();++i)
              cout<<" "<<post[i];

       }
       else
       {
            cout<<"YES"<<endl;
           cout<<post_[0];
           for(int i=1;i<post_.size();++i)
              cout<<" "<<post_[i];

       }


   }





    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值