【字符串】FBI树

题目链接:https://ac.nowcoder.com/acm/problem/16660
在这里插入图片描述

思路:

题目要让我们做的是,将01构成的字符串转换为由BIF字符构成的树的后序遍历。
首先,(拿10001011做例子)根节点为F,原因是10001011即包含0又包含,然后
第一次将字符串二分,成为1000+1010,左子树为F(1000),右子树为F(1010)
第二次进行二分,成为10+00 ,变成F+B,分别表示1000的左子树和右子树,以及10+10,变成F+F,分别表示1010的左子树和右子树
第三次进行二分,成为1 0 0 0 1 0 I 0,也就是叶子结点,分别变成,I B B B I B I B
图就懒得画了,就是一棵树结构的模样
这里我们可以利用归并排序的思路来做,首先将01字符串进行二分,然后将单个字符两两邻居合并,合并的同时保存合并的结果,可以发现递归二分和归并得到的结果正好就是树的后序遍历
如10001010:二分完成后变为1 0 0 0 1 0 1 0 ,第一次归并得到10 00 第二次归并得到1000,第三次归并得到10 10 第四次归并得到1010,第三次得到10001010,这样保存的结果正好就是10 00 1000 10 10 1010 10001010,也就是树的后序遍历(不包括叶子节点),如何得到叶子节点呢?我们可以在归并的同时,判断归并的结果,其字符串长度是否为2,如果为2,就说明这次归并是通过归并叶子节点得到的,然后进行输出。对于转换为FBI字符,就比较好判断了,直接进行判断是否全1,全0,或都有即可
代码如下:

n = int(input())
string = input()
ans = []
def JugAns(string):#判断字符串的类型
    if string.find('1')!=-1 and string.find('0')!=-1:return 'F'       #都有
    elif string.find('1')!=-1 and string.find('0')==-1:return 'I' #只有1
    else: return 'B'
def Merge(string,low,high):#归并
    if low==high-1:
        ans.append(string[low]);ans.append(string[high])
    ans_temp = ''
    for i in range(low,high+1):
        ans_temp = ans_temp+string[i]
    ans.append(ans_temp)
def Split(string,low,high):#二分递归拆分
    if low >= high:
        return
    mid = (high+low)//2
    Split(string,low,mid)
    Split(string,mid+1,high)
    Merge(string,low,high)
if len(string)==1:print(JugAns(string))#如果长度为1,直接输出
else:
    Split(string,0,len(string)-1)
    for i in ans:
        print(JugAns(i),end='')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章