zoukankan      html  css  js  c++  java
  • PAT 1043 二叉查找树

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    
    const int SIZE = 5000;
    
    int g_preOrder[SIZE];
    int g_preOrderImg[SIZE];
    int g_postOrder[SIZE];
    int g_index = 0;
    
    struct BSNode
    {
        BSNode *left;
        BSNode *right;
        int key;
    };
    
    //在一颗二叉查找树中添加一个节点。isImg为true,则表示生成的
    //是二叉查找树的镜像;
    void insertNode(BSNode* &p, int key,bool isImg)
    {
        if(p == NULL)
        {
            p = new BSNode();
            p->left = NULL;
            p->right = NULL;
            p->key = key;
            return;
        }
        else
        {
            if(isImg)
            {
                if(p->key <= key)
                    insertNode(p->left, key, isImg);
                else
                    insertNode(p->right, key, isImg);
            }
            else
            {
                if(p->key > key)
                    insertNode(p->left, key, isImg);
                else
                    insertNode(p->right, key, isImg);
            }
        }
        
    }
    
    
    //创建一颗二叉查找树或其镜像。
    void createBST(BSNode* &root, int arr[], int n,bool isImg)
    {
        for(int i=0; i<n; i++)
        {
            insertNode(root, arr[i], isImg);
        }
    }
    
    void preOrder(BSNode* root,bool isImg)
    {
        if(root == NULL)
            return;
        if(isImg)
            g_preOrderImg[g_index++] = root->key;
        else
            g_preOrder[g_index++] = root->key;
        if(root->left)
            preOrder(root->left,isImg);
        if(root->right)
            preOrder(root->right,isImg);
    }
    
    //二叉查找树或其镜像的输出结果。
    void postOrder(BSNode* root)
    {
        if(root == NULL)
            return;
        if(root->left)
            postOrder(root->left);
        if(root->right)
            postOrder(root->right);
        g_postOrder[g_index++] = root->key;
    }
    
    //检查两个数组的内容是否相同。
    bool checkIsSame(int a[],int b[], int len)
    {
        int i = 0;
        for(i=0; i<len; i++)
            if(a[i] != b[i])
                return false;
        return true;
    }
    
    //输出后序遍历的结果。
    void printRes(int arr[], int len)
    {
        bool isFirst = true;
        int i = 0;
        for(i=0; i<len; i++)
        {
            if(isFirst)
            {
                cout<<arr[i];
                isFirst = false;
            }
            else
            {    
                cout<<" "<<arr[i];
            }
            if(i == len-1)//最后一个元素要输出换行符
                cout<<endl;
        }
    }
    
    //释放一颗二叉树的节点
    void freeNodes(BSNode *root)
    {
        if(NULL == root->left && NULL == root->right)
            delete root;
        else if(root->left)
            freeNodes(root->left);
        else if(root->right)
            freeNodes(root->right);
    }
    
    
    int main()
    {
        int i,j,N,arr[1003];
        while(cin>>N)
        {
            BSNode *root = NULL;
            BSNode *rootImg = NULL;
            for(i=0; i<N; i++)
            {
                cin>>arr[i];
            }
            createBST(root, arr, N, false);
            createBST(rootImg, arr, N, true);
            g_index = 0;
            preOrder(root,false);//得到二叉查找树的先序遍历结果
            if(checkIsSame(arr, g_preOrder, N))
            {
                cout<<"YES"<<endl;
                g_index = 0;
                postOrder(root);
                printRes(g_postOrder, N);
            }    
            else 
            {
                g_index = 0;
                preOrder(rootImg, true);//得到二叉查找树镜像的先序遍历结果
                if(checkIsSame(arr, g_preOrderImg, N))
                {
                    cout<<"YES"<<endl;
                    g_index = 0;
                    postOrder(rootImg);
                    printRes(g_postOrder,N);
                }
                else
                    cout<<"NO"<<endl;            
            }
            
            freeNodes(root);
            freeNodes(rootImg);
        }
        
        return 0;
    }
  • 相关阅读:
    ffmpeg rtmp推流 视频转码
    java日志发展史 log4j slf4j log4j2 jul jcl 日志和各种桥接包的关系
    nginx stream 流转发,可以转发rtmp、mysql访问流,转发rtmp、jdbc请求
    java web http 转https 通过nginx代理访问
    linux 服务器磁盘挂载
    novnc 通过websockify代理 配置多点访问
    linux 文件服务 minio 安装部署配置
    AOP实现原理,手写aop
    java 泛型
    JAVA反射getGenericSuperclass()用法
  • 原文地址:https://www.cnblogs.com/yanhaiming/p/2789863.html
Copyright © 2011-2022 走看看