zoukankan      html  css  js  c++  java
  • PAT A1043 Is It a Binary Search Tree [二叉查找树及遍历]

    题目描述

    链接
    给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果

    分析

    • 注意每个地方二叉查找树的定义不同,看清题目
    • 写insert函数的时候,不要忘记左右子树为NULL
    • 镜像二叉查找树实际就是遍历的时候,把左右次序更换下就好了!
    #include<bits/stdc++.h>
    using namespace std;
    
    const int maxn = 1005;
    struct node{
        int data;
        node *lchild;
        node *rchild;
    }nodes[maxn];
    
    int a[maxn], n;
    
    void insert(node *&root, int x){
        if(root == NULL){
            root = new node;
            root->data = x;
            root->lchild = NULL; //不要忘记!
            root->rchild = NULL; //不要忘记!
            return;
        }
        if(x < root->data) insert(root->lchild, x); //题目定义不同
        else insert(root->rchild, x);
    }
    
    node *create(){
        node *root = NULL;
        for(int i=0;i<n;i++){
            insert(root, a[i]);
        }
        return root;
    }
    
    vector<int> b,c,d;
    void preorder(node *root){
        if(root==NULL) return;
        b.push_back(root->data);
        preorder(root->lchild);
        preorder(root->rchild);
    }
    
    void preorder2(node *root){
        if(root==NULL) return;
        c.push_back(root->data);
        preorder2(root->rchild);
        preorder2(root->lchild);
    }
    
    void postorder(node *root){
        if(root==NULL) return;
        postorder(root->lchild);
        postorder(root->rchild);
        d.push_back(root->data);
    }
    
    void postorder2(node *root){
        if(root==NULL) return;
        postorder2(root->rchild);
        postorder2(root->lchild);
        d.push_back(root->data);
    }
    
    int main(){
        cin>>n;
        for(int i=0;i<n;i++){
            cin>>a[i];
        }
        node *root = create();
        preorder(root);
        preorder2(root);
        bool flag1 = true, flag2 = true;
        for(int i=0;i<n;i++){
            if(a[i] != b[i]) {flag1 = false; break;}
        }
        for(int i=0;i<n;i++){
            if(a[i] != c[i]) {flag2 = false; break;}
        }
        if(flag1){
            postorder(root);
            cout<<"YES"<<endl;
            for(int i=0;i<n;i++){
                if(i==0) cout<<d[i];
                else cout<<" "<<d[i];
            }
            cout<<endl;
        }else if(flag2){
            postorder2(root);
            cout<<"YES"<<endl;
            for(int i=0;i<n;i++){
                if(i==0) cout<<d[i];
                else cout<<" "<<d[i];
            }
            cout<<endl;
        }else{
            cout<<"NO"<<endl;
        }
    
    }
    
    
  • 相关阅读:
    关于编码的两个小点(摘)
    c#中类和成员的修饰符介绍
    jquery/js不支持ie9以下版本的方法或属性
    一次Linux系统被攻击的分析过程
    运维堡垒机(跳板机)系统 python
    puppet 3+Unicorn+Nginx安装配置
    用memcache来同步session
    php+memcache实现的网站在线人数统计
    CentOS yum 源的配置与使用
    Bind+DLZ构建企业智能DNS/DNS
  • 原文地址:https://www.cnblogs.com/doragd/p/11270835.html
Copyright © 2011-2022 走看看