• hdoj3791


    题目

    Problem Description
    判断两序列是否为同一二叉搜索树序列
     
    Input
    开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
    接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
    接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
     
    Output
    如果序列相同则输出YES,否则输出NO
     
    Sample Input
    2 567432 543267 576342 0
     
    Sample Output
    YES NO
     

    分析:

    一道二叉搜索树的题目。将序列转换成二叉搜索树,然后遍历。如果遍历的结果相同,那么是同一颗二叉树。注意没有重复数字。
    下方给出了前序遍历的解法。
     
    https://github.com/pusidun/OJ_Answer/tree/master/HDOJ/3791
    #include <cstdio>
    #include <vector>
    #include <cstring>
    #include <iostream>
    using namespace std;
    
    //rst1保存第一个树的前序遍历结果,rst2保存后面n个树的前序遍历结果,index为这2个数组的下标
    int rst1[11];
    int rst2[11];
    int index = 0;
    
    class BST{
    private:
        struct Node{
            int key;
            Node* left;
            Node* right;
    
            Node(){
                this->key = 0;
                this->left = NULL;
                this->right = NULL;
            }
    
            Node(int num){
                this->key = num;
                this->left = NULL;
                this->right = NULL;
            }
    
        };
    
        Node* root;
    
        Node* insert(Node* node, int num){
            if (node == NULL){
                count++;
                return new Node(num);
            }
            if (node->key < num){
                node->right = insert(node->right, num);
            }
            else if (node->key > num){
                node->left = insert(node->left, num);
            }
            return node;
        }
    
        //select用来选择前序遍历结果的保存位置
        void preOrder(Node* node, int select){
            if (node == NULL)
                return;
            if (select == 1)
                rst1[index++] = node->key;
            else if (select == 2)
                rst2[index++] = node->key;
            preOrder(node->left, select);
            preOrder(node->right, select);
        }
    
        void remove(Node* node){
            if (node == NULL)
                return;
            remove(node->left);
            remove(node->right);
            delete node;
        }
        
    public:
        int count;
    
        BST(){
            root = NULL;
            count = 0;
        }
    
        ~BST(){
            remove(root);
        }
    
        void insert(int num){
            root = insert(root, num);
        }
    
        void preOrder(int select){
            preOrder(root, select);
        }
    };
    
    void str2int(char* s, int* arr){
        for (int i = 0; s[i] != ''; i++){
            arr[i] = s[i] - '0';
        }
    }
    
    int main()
    {
        int n;  //第一个数n 
        while (scanf("%d", &n) != EOF && n != 0)
        {
            BST raw;  //第一行序列 
            int num = 0;
    
            //存储序列的数组 
            char tmp[12];
            int raw_seq[11];
            int test_seq[11];
    
            memset(tmp, 0, sizeof(tmp));
            memset(raw_seq, -1, sizeof(raw_seq));
            scanf("%s", tmp);
            str2int(tmp, raw_seq);
    
            for (int i = 0; raw_seq[i] != -1 && i<11; i++)
                raw.insert(raw_seq[i]);
    
            for (int i = 0; i<n; i++){
                BST test;  //接下来的n行序列 
                memset(tmp, 0, sizeof(tmp));
                memset(test_seq, -1, sizeof(test_seq));
                scanf("%s", tmp);
                str2int(tmp, test_seq);
                for (int i = 0; test_seq[i] != -1 && i<11; i++)
                    test.insert(test_seq[i]);
    
                index = 0;
                raw.preOrder(1);
                index = 0;
                test.preOrder(2);
                
                int flag = 0;
                for (int i = 0; i < index; i++)
                    if (rst1[i] != rst2[i]){
                        flag = 1;
                        break;
                    }
    
                if (flag == 1)
                    printf("NO
    ");
                else if (flag == 0)
                    printf("YES
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    JMX示例
    在开发iOS程序时对日期处理的总结(转)
    iOS 身份证验证(转)
    IOS --- OC与Swift混编(转)
    Charles辅助调试接口(转)
    iOS 调试 crash breakpoint EXC_BAD_ACCESS SIGABRT(转)
    Objective-C中常量重复定义的解决方案
    layoutSubviews、drawRect、initialize和load方法的调用
    (转)iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)
    Mac OS10.10 openfire无法启动问题(转)
  • 原文地址:https://www.cnblogs.com/pusidun/p/8602438.html
Copyright © 2020-2023  润新知