蓝桥杯备赛(Day5)——二叉树

news2024/11/27 21:47:46

二叉树存储

普通做法,二叉树一个节点包括结点的数值以及指向左右子节点的指针

在class Node中

def __init__(self,s,l=None,r=None):
    self.val=None
    self.l=l
    self.r=r

在竞赛中,我们往往使用静态数组实现二叉树,定义一个大小为N的静态结构体数组,使用其来存储一棵二叉树。

#定义静态数组
tree=['']*10000
#根节点
tree[1]
#结点tree[p]的左子节点
tree[2*p]
#结点tree[p]的右子节点
tree[2*p+1]

使用静态数组时,对应的tree假如不是满二叉树,则应该使用-1或者0填补空缺,这样tree对应的静态数组即可使用于任何一个二叉树。 

三种遍历方式

先序遍历

EBADCGFIH

def preorder(p):
    print(tree[p],end='')
    if tree[2*p]!='':
        postorder(2*p)
    if tree[2*p+1]!='':
        postorder(2*p+1)

按照父、左儿子、右儿子的顺序进行访问

中序遍历

ABCDEFGHI

def inorder(p):
    if tree[2*p]!='': inorder(2*p)
    print(tree[p],end='')
    if tree[2*p+1]!='': inorder(2*p+1)

按照左儿子 、父、右儿子的顺序进行访问

后序遍历

ACDBFHIGE

def postorder(p):
    if tree[2*p] != '':    postorder(2*p)
    if tree[2*p+1] !='':   postorder(2*p+1)
    print(tree[p],end='')

按照左儿子、右儿子、父的顺序访问。

根据中序遍历和后序遍历可以确定一棵树。

由先序遍历和后序遍历不能确定一棵树。

FBI树

题目描述

我们可以把由 “0” 和 “1” 组成的字符串分为三类:全 “0” 串称为 B 串,全 “1” 串称为 I 串,既含 “0” 又含 “1” 的串则称为 F 串。

FBI树是一种二叉树,它的结点类型也包括 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树,并输出它的后序遍历序列。

输入描述

第一行是一个整数 N(0≤N≤10)N(0≤N≤10)。

第二行是一个长度为 2^N 的 “01” 串。

输出描述

输出一个字符串,即 FBI 树的后序遍历序列。

输入输出样例

示例 1

3  
10001011

输出

IBFBBBFIBFIIIFF

 错误做法

class node:
  def __init__(self,s,l=None,r=None):
    self.val=None
    self.l=l;
    self.r=r
    if '0' in s and 'l' in s:
      self.val='F'
    elif '0' in s:
      self.val='B'
    else:
      self.val='I'

def build(s):
  if len(s)==1:
    return node(s)
  if len(s)==0:
    return None
  root=node(s,build(s[:len(s)//2]),build(s[len(s)//2:]))
  return root

def postorder(root):
  if root:
    postorder(root.l)
    postorder(root.r)
    print(root.val,end='')
  else:
    return

n=int(input())
s=input()
root=build(s)
postorder(root)

此外,可以使用一维数组存储二叉树.

def build(p,L,R):
  if L==R:
    if s[R]=='1':
      tree[p]='I'
    else:
      tree[p]='B'
    return
  mid=(L+R)//2
  build(2*p,L,mid)
  build(2*p+1,mid+1,R)
  if tree[2*p]=='B' and tree[2*p+1]=='B':
    tree[p]='B'
  elif tree[2*p]=='I' and tree[2*p+1]=='I':
    tree[p]='I'
  else:
    tree[p]='F'

def postorder(p):
  if tree[2*p]!='':
    postorder(2*p)
  if tree[2*p+1]!='':
    postorder(2*p+1)
  print(tree[p],end='')

n=int(input())
s=[0]+list(input())
tree=['']*4400
build(1,1,len(s)-1)
postorder(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/976304.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用iCloud和Shortcuts实现跨设备同步与自动化数据采集

在如今的数字时代,跨设备同步和自动化数据采集对于提高工作效率和便利性至关重要。苹果的iCloud和Shortcuts App为我们提供了强大的工具,可以实现跨设备同步和自动化数据采集的功能。本文将详细介绍如何利用iCloud和Shortcuts App实现这些功能&#xff0…

英诺森供应链一体化平台解析

近日,2023年中国物流与采购联合会科学技术奖正式公布,该奖项经国家科技部批准,在国家科学技术奖励工作办公室登记备案,是我国物流行业最具影响力的奖项之一。 英诺森联合客户申报的科技项目“英诺森供应链智能数据平台”&#xf…

Golang编写客户端SDK,并开源发布包到GitHub,供其他项目import使用

目录 编写客户端SDK,并开源发布包到GitHub1. 创建 GitHub 仓库2. 构建项目,编写代码Go 代码示例:项目目录结构展示: 3. 提交代码到 GitHub仓库4. 发布版本5. 现在其他人可以引用使用你的模块包了 编写客户端SDK,并开源…

记一次以太网连接失败修复

症状: 很久没用这个电脑了,开机以后,发现连不上校园网。 遂检查网线,发现网线连在自己笔记本是可以用的,说明网线没问题。 但是网线连在主机是红灯常亮黄灯闪烁,怀疑是网卡有问题(后证明不是&#xff0c…

成都车展:比亚迪“豹力美学”杀入硬派SUV市场

在熙熙攘攘人头攒动的2023成都国际车展上,如果要评选一家人气最旺的车企展台,那必然非比亚迪莫属。 在比亚迪现场展示的多款车型中,作为比亚迪旗下方程豹品牌的首款车型,以“超级混动硬派SUV”著称的方程豹5,自然吸引了…

nuxt中extendRoutes添加多个扩展路由

文档中https://www.nuxtjs.cn/api/configuration-router有写使用extendRoutes添加多个路由 添加多个路由,数组拼接只能使用push,其实均不管用

【王道】操作系统笔记 第一章 操作系统概述

1.1.1 操作系统的概念和功能 我们熟悉的操作系统有哪些? 从计算机系统的层次结构上看操作系统: 以一台电脑的诞生为例: 第一步,厂家组装一台裸机 第二步,出售前安装操作系统 第三步,用户安装应用程序 第四…

一日一技:Python如何同时调用多个GPT的API?

相信很多同学或多或少都在Python中使用过GPT API,通过Python安装openai库,来调用GPT模型。 OpenAI官方文档中给出了一个示例,如下图所示: OpenAI API 测试 如果你只有一个API账号,那么你可能不觉得这样写有什么问题。…

其他计算机系统基础知识

其他计算机系统基础知识 概述计算机语言多媒体系统工程系统工程方法切克兰德方法并行工程方法综合集成法WSR方法 系统工程的生命周期基于模型的系统工程 概述 不考 学系统工程就行 整体来说考的概率不大,以了解为主 计算机语言 多媒体 15年之前考过 系统工程 系统工…

systemverilog仿真时候传递参数

$test$plusargs和$value$plusarg的区别和使用 本文参考的文章vcs2021 user guiger 别的版本可能会有不一样 纯学习笔记 文章原文 ( t e s t test testplusargs) 在运行时启用调试功能 在“ifdef”编译器指令的位置使用 t e s t test testplusargs系…

web靶场——xss-labs靶机平台的搭建和代码审计

目录 一、web靶场-xss-labs靶机平台的搭建 1、将下载好的压缩包放置php的WWW根目录下 2、配置网站 3、启动MYSQL和Nginx 4、完成后我们就可以在浏览器输入127.0.0.1:8088进入靶场 二、xss-labs靶场通关攻略 第一关: 1、输入代码进行测试&#xf…

Linux——(第三章)Vi和Vim编辑器

目录 1.Vi和Vim的基本介绍 2.Vi和Vim三种模式的切换 3.一般模式 4.编辑模式 5.指令模式 1.Vi和Vim的基本介绍 Vi是Unix操作系统和类Unix操作系统中最通用的文本编辑器。 Vim编辑器是从Vi发展出来的一个性能更强大的文本编辑器。可以主动的以字体颜色辨别语法的正确性&…

Python怎么实现更高效的数据结构和算法? - 易智编译EaseEditing

要实现更高效的数据结构和算法,你可以考虑以下几个方面的优化: 选择合适的数据结构: 选择最适合你问题的数据结构至关重要。例如,如果需要频繁插入和删除操作,可能链表比数组更合适。如果需要高效查找操作&#xff0…

加餐1|辞职问题:古人怎么写高端辞职信?

好诗相伴,千金不换。你好,我是天博。 我们这一讲是加餐,我想聊的是,古人是怎么处理我们现实生活里的一些难题的,比如古人是怎么面试的,怎么辞职的。在加餐里,我不会主讲某首诗,而是…

跨源资源共享(CORS)Access-Control-Allow-Origin

1、浏览器的同源安全策略 没错,就是这家伙干的,浏览器只允许请求当前域的资源,而对其他域的资源表示不信任。那怎么才算跨域呢? 请求协议http,https的不同域domain的不同端口port的不同 好好好,大概就是这么回事啦&…

高效能,一键批量剪辑,AI智剪让创作更轻松

在今天的数字化时代,视频制作已经成为各种行业和领域的必备技能。然而,视频剪辑过程往往繁琐且耗时,大大降低了我们的工作效率。幸运的是,随着人工智能技术的发展,我们有了新的解决方案——AI智剪软件。 AI智剪软件&am…

4年外包出来人废了,5个面试挂了4个....

我的情况 大概介绍一下个人情况,男,毕业于普通二本院校非计算机专业,18年跨专业入行测试,第一份工作在湖南某软件公司,做了接近4年的外包测试工程师,今年年初,感觉自己不能够再这样下去了&…

Spring源码解析-构造函数

1、构造函数概述 构造函数中,主要创建两个对象分别用来读取注解参数和classpath下的文件 AnnotatedBeanDefinitionReader 专门读取注解参数的Reader ClassPathBeanDefinitionScanner 专门读取classpath下的文件,例如yml、properties等。 AnnotationC…

hive指定字段插入数据,包含了分区表和非分区表

1、建表 语句如下: CREATE EXTERNAL TABLE ods_lineitem_full (l_shipdate date,l_orderkey bigint,l_linenumber int,l_partkey int,l_suppkey int,l_quantity decimal(15, 2),l_extendedprice decimal(15, 2),l_discount de…

专题:跨域数据管理

点击上方蓝字关注我们 2023年2月,中共中央、国务院印发《数字中国建设整体布局规划》,指出建设数字中国是数字时代推进中国式现代化的重要引擎,加快数字中国建设,对全面建设社会主义现代化国家、全面推进中华民族伟大复兴具有重要…