• 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;
    }
  • 相关阅读:
    Python电影投票系统
    Python打印一个等边三角形
    打印正直角三角形
    MySQL指令
    MySQL安装 8.0.15版本
    局部变量 全局变量
    目录
    格式化输出
    转义字符
    ffmpeg 从内存中读取数据(或将数据输出到内存)
  • 原文地址:https://www.cnblogs.com/yanhaiming/p/2789863.html
Copyright © 2020-2023  润新知