zoukankan      html  css  js  c++  java
  • 1365:FBI树(fbi)

    【题目描述】

    我们可以把由“00”和“11”组成的字符串分为三类:全“00”串称为BB串,全“11”串称为II串,既含“00”又含“11”的串则称为FF串。

    FBI树是一种二叉树,它的结点类型也包括FF结点,BB结点和II结点三种。由一个长度为2N2N的“0101”串SS可以构造出一棵FBI树TT,递归的构造方法如下:

    TT的根结点为RR,其类型与串SS的类型相同;

    若串SS的长度大于11,将串SS从中间分开,分为等长的左右子串S1S1和S2S2;由左子串S1S1构造RR的左子树T1T1,由右子串S2S2构造RR的右子树T2T2。

    现在给定一个长度为2N2N的“0101”串,请用上述构造方法构造出一棵FBI树,并输出它的后序遍历序列。

    【输入】

    第一行是一个整数N0N10N(0≤N≤10),第二行是一个长度为2N2N的“0101”串。

    【输出】

    一行,这一行只包含一个字符串,即FBI树的后序遍历序列。

    【输入样例】

    3
    10001011

    【输出样例】

    IBFBBBFIBFIIIFF

    【提示】

    对于40%的数据,N2N≤2;

    对于100%的数据,N10N≤10。

    #include <bits/stdc++.h>
    using namespace std;
    
    struct Node {
        char value;
        Node *left, *right;
    };
    
    char GetValue(const string &s, int index, int limit)
    {
        int zero = 0, one = 0;
        for (int i = index; i < limit; i++) {
            if (s[i] == '0') {
                zero += 1;
            } else if (s[i] == '1') {
                one += 1;
            }
        }
        if (zero > 0 && one > 0) {
            return 'F'; // 01
        } else if (zero > 0) {
            return 'B'; // 0
        } else if (one > 0) {
            return 'I'; // 1
        } else {
            return 'E'; // error
        }
    }
    
    Node *CreateTree(const string &s, int left, int right)
    {
        if (left < 0 || left >= right) {
            return NULL;
        } else {
            Node *root = new Node;
            root->value = GetValue(s, left, right);
            // cout << left << "," << right << "=" << root->value << endl;
            root->left = root->right = NULL;
            if (right - left > 1) { // 多于1个
                int mid = (left + right) / 2;
                root->left = CreateTree(s, left, mid);
                root->right = CreateTree(s, mid, right);
            }
            return root;
        }
    }
    
    string PreOrder(Node *root)
    {
        string s;
        if (root != NULL) {
            s.push_back(root->value);
            s += PreOrder(root->left);
            s += PreOrder(root->right);
        }
        return s;
    }
    
    string InOrder(Node *root)
    {
        string s;
        if (root != NULL) {
            s += InOrder(root->left);
            s.push_back(root->value);
            s += InOrder(root->right);
        }
        return s;
    }
    
    string PostOrder(Node *root)
    {
        string s;
        if (root != NULL) {
            s += PostOrder(root->left);
            s += PostOrder(root->right);
            s.push_back(root->value);
        }
        return s;
    }
    
    int main()
    {
        // freopen("1.txt", "r", stdin);
        int n = 3;
        string s = "10001011";
        cin >> n >> s;
        Node *root = CreateTree(s, 0, s.size());
        // cout << PreOrder(root) << endl;
        // cout << InOrder(root) << endl;
        cout << PostOrder(root) << endl;
        return 0;
    }
  • 相关阅读:
    awk线程号
    std::string::substr函数
    计数器表的简单使用
    vim + oh-my-zsh + git搭建开发环境
    <<代码大全>>阅读笔记之二 变量名的力量
    <<代码大全>>阅读笔记之一 使用变量的一般事项
    压测工具ab的简单使用
    nginx配置文件详解
    numba初体验
    Linux查找文件内容小技巧
  • 原文地址:https://www.cnblogs.com/gaojs/p/14942481.html
Copyright © 2011-2022 走看看