zoukankan      html  css  js  c++  java
  • FBI树

    FBI树

    题目描述

      我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。
      FBI树是一种二叉树1,它的结点类型也包括F结点,B结点和I结点三种。由一个长度为2^N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下:
      1) T的根结点为R,其类型与串S的类型相同;
      2) 若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。
      现在给定一个长度为2^N的“01”串,请用上述构造方法构造出一棵FBI树,并输出它的后序遍历2序列。

    输入格式

    输入的第一行是一个整数N(0<=N<=10),第二行是一个长度为2^N的“01”串。

    输出格式

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

    样例输入

    3

    10001011

    样例输出

    IBFBBBFIBFIIIFF

    解法一:

    递归算法

    var n,s,i:integer;
    a:array[1..1024] of char;
    function find(l,r:integer):char;
    var ls,rs,ts:char;
    m:integer;
    begin
        if l=r then
        begin
            if a[l]='0' then ts:='B'
            else ts:='I';
            write(ts);
            exit(ts)
        end
        else
        begin
            m:=l+(r-l+1) div 2;
            ls:=find(l,m-1);
            rs:=find(m,r);
            if ls=rs then
                ts:=ls
            else
                ts:='F';
            write(ts);
            exit(ts);    
        end;
    end;
    begin
        assign(input,'fbi.in');reset(input);
        assign(output,'fbi.out');rewrite(output);
        readln(n);
        s:=1;
        for i:=1 to n do s:=s*2;
        for i:=1 to s do read(a[i]);
        find(1,s);
        close(input);close(output);
    end.

    解法二:

    利用二叉树性质,先存储到数组中,在对树进行后续遍历

    {
    by hcy 2012.10.24
    fbi by binary-tree
    }
    var n,s,i,l,r:integer;
    a:array[1..1024] of char;
    b:array[1..1024*2] of char;
    procedure lrtTravel(t,k:integer);//l-r-t 
    begin
        if k>n then write(b[t])
        else
        begin
            lrtTravel(t*2,k+1);
            lrtTravel(t*2+1,k+1);
            write(b[t]);
        end;
    end;
    begin
        assign(input,'fbi.in');reset(input);
        assign(output,'fbi.out');rewrite(output);
        readln(n);
        s:=1;
        for i:=1 to n do s:=s*2;
        for i:=1 to s do read(a[i]);
        for i:=s to 2*s-1 do 
            if a[i-s+1]='0' then b[i]:='B'
            else b[i]:='I';
        for i:=s-1 downto 1 do
        begin
            l:=i*2;
            r:=l+1;
            if b[l]=b[r] then b[i]:=b[l]
            else b[i]:='F';
        end;
        lrtTravel(1,1);
        //for i:=1 to 2*s-1 do write(b[i]);
        close(input);close(output);
    end.
  • 相关阅读:
    Qt之任务栏系统托盘图标
    Qt中 QTableWidget用法总结
    cookie详解
    爬虫cookie
    代理授权验证_web客户端授权验证
    ProxyHandler处理器__代理设置__自定义opener
    Handler处理器和自定义Opener
    记录英语单词19.03.14
    转义字符的英语缩写
    之前记录的单词07
  • 原文地址:https://www.cnblogs.com/nbalive2001/p/2737056.html
Copyright © 2011-2022 走看看