信息学奥赛初赛天天练-24-二叉树、N叉树遍历技巧与前缀表达式、中缀表达式、后缀表达式应用实战演练
PDF文档公众号回复关键字:20240609
单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项)
5 根节点的高度为1,一根拥有2023个节点的三叉树高度至少为( )。
A 6
B 7
C 8
D 9
8 后缀表达式 6 2 3 + - 3 8 2 / + * 2 ^ 3 + 对应的中缀表达式是( )
A ((6 - (2 + 3)) * (3 + 8 / 2)) ^ 2 + 3
B 6 - 2 + 3 * 3 + 8 / 2 ^ 2 + 3
C (6 - (2 + 3)) * ((3 + 8 / 2) ^ 2) + 3
D 6 - ((2 + 3) * (3 + 8 / 2)) ^ 2 + 3
2 相关知识点
1) 树
线性结构(数组、链表等)中节点是首位相接一对一关系,在树结构中节点之间不再是简单的一对一关系,而是较为复杂的一对多的关系
数据结构中的 树 的名字由来,是因为如果把节点之间的关系直观展示出来,由于长得和现实世界中的树很像,由此得名
2) 二叉树
每个结点至多拥有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒
例如下面是一棵二叉树
3) n叉树
每个结点至多拥有n棵子树(即n叉树中不存在度大于n的结点)
如下是1棵三叉树
4) 二叉树的遍历
常见的二叉树的遍历主要有3种,先序遍历,中序遍历,后序遍历,层序遍历
先序遍历
先序遍历又叫先根遍历,遍历的顺序为根,左孩子,右孩子
下面二叉树的前序遍历顺序为 ABDHIEJCFKG
中序遍历
中序遍历又叫中根遍历,遍历的顺序为左孩子,根,右孩子
下面二叉树的中序遍历顺序为 HDIBJEAFKCG
后序遍历
后序遍历又叫后根遍历,遍历的顺序为左孩子,右孩子,根
下面二叉树的后序遍历顺序为 HIDJEBKFGCA
层序遍历
层序遍历,遍历的顺序为从上到下,从左到右
下面二叉树的层序遍历顺序为 ABCDEFGHIJK
5) 表达式
中缀表达式
是一种常见的算术表达式表示方法,其中运算符位于操作数之间
例如
//示例1
3 + 4 * 2
//示例2
(1 + 2) * (3 - 4)
前缀表达式
前缀表达式,也称为波兰表达式,是一种算术表达式表示方法,其中运算符位于操作数之前.
例如
//示例1 中缀表达式a+b对应的前缀表达式
+a b
//示例2 中缀表达式3+4*2对应的前缀表达式
+ 3 * 4 2
后缀表达式
后缀表达式,也称为逆波兰表达式,是一种算术表达式表示方法,其中运算符位于操作数之后
例如
//示例1 中缀表达式a+b对应的后缀表达式
a b+
//示例2 中缀表达式3+4*2对应的前缀表达式
3 4 2 * +
这几种表达式之间可以相互转换,下面介绍一下这几种表达式之间的转换方法
中缀转后缀
确定优先级,按优先级逐一处理操作符(把操作符从操作数中间移到操作数后边)
例如如下中缀表达式转为后缀表达式
1 + ( 2 + 3)* 4 ) – 5
// 按优先级对表达式数字加括号
((1 + (( 2 + 3)* 4 )) – 5 )
//从最里面的一层括号开始运算,转换成后缀表达式
//转换方法,去除括号,数字在前,顺序不变,操作符移到最后
1. ( 2 + 3) => 2 3 +
// ( 2 + 3)可以看作一个整体x
2. (( 2 + 3)* 4 ) => (x+4) => x 4 + => 2 3 + 4 *
//(( 2 + 3)* 4 )看作一个整体x
3. (1 + (( 2 + 3)* 4 ))=> (1+x)=>1 x + = 1 2 3 + 4 * +
// (1 + (( 2 + 3)* 4 )) 看作一个整体x
4. ((1 + (( 2 + 3)* 4 )) – 5 ) =>(x-5)=>x 5 - => 1 2 3 + 4 * + 5 -
所以转换后的后缀表达式为 1 2 3 + 4 * + 5 -
中缀转前缀
中缀表达式转后缀表达式类似,本次考试不涉及,可以参考如下文章
https://www.cnblogs.com/myeln/articles/13439541.html
后缀转中缀
后缀表达式转中缀表达式需要构造表达式树
转换方法如下
从左到右扫面后缀表达式,一次一个符号读入表达式
如果符号是操作数,那么就建立一个单节点树并将它推入栈中。
如果符号是操作符,那么就从栈中弹出两个树T1(右子树)和T2(左子树)(T1先弹出)并形成一颗新的树,该树的根就是操作符
例如
假定有后缀表达式1 2 3 + 4 * +5 – ,请将它转化为前缀表达式
1它的左、右儿子分别是T2和T1(先出的为右子树,后出的为左子树)。然后将指向这棵新树的指针压入栈中
前三个符号是操作数,因此创建三颗单节点树并将指向它们的指针压入栈中
2 “+”被读入,因此指向最后两颗树的指针被弹出,形成一颗新树,并将指向新树的指针压入栈中。
3 扫描4和*后
4 扫描+后,有扫描5入栈
5 扫描-后,表达式树构造完成
表达式数建好后,可以根据树的中序遍历直接输出中缀表达式
同样,也可以根据前序遍历输出前缀表达式,通过后缀遍历输出后缀表达式
前缀转中缀
前缀表达式转中缀表达式类似后缀表达式转中缀表达式,需要构造表达式树,具体过程如下
https://www.cnblogs.com/myeln/articles/13440496.html
3 思路分析
5 根节点的高度为1,一根拥有2023个节点的三叉树高度至少为( )。
A 6
B 7
C 8
D 9
答案 C
分析
满每一层都满的情况下节点数为s=(3^n-1)/2,2023 个节点介于 7 层到 8 层之间,所以最少需要 8 层二叉树,所以至少八层
如果不记得上面公式也可以手动计算得出
根据三叉树的性质,每一层都满的情况下
1层 3^0=1
2层 3^0 + 3^1=4
3层 3^0 + 3^1 +3^2=13
4层 3^0 + 3^1 +3^2 + 3^3=40
5层 3^0 + 3^1 +3^2 + 3^3 + 3^4=121
6层 3^0 + 3^1 +3^2 + 3^3 + 3^4 + 3^5 = 364
7层 3^0 + 3^1 +3^2 + 3^3 + 3^4 + 3^5 + 3^6 = 1093
8层 3^0 + 3^1 +3^2 + 3^3 + 3^4 + 3^5 + 3^6 +3^7= 3280
第7层不够,第8层超过,所以是8层
8 后缀表达式 6 2 3 + - 3 8 2 / + * 2 ^ 3 + 对应的中缀表达式是( )
A ((6 - (2 + 3)) * (3 + 8 / 2)) ^ 2 + 3
B 6 - 2 + 3 * 3 + 8 / 2 ^ 2 + 3
C (6 - (2 + 3)) * ((3 + 8 / 2) ^ 2) + 3
D 6 - ((2 + 3) * (3 + 8 / 2)) ^ 2 + 3
答案 A
分析
方法1
后缀转中缀,可以构造表达式树
1操作数6 2 3依次入栈
2 操作符+进入
3 操作符-号进入
4 操作数 3 8 2 进入
5 除号 / 进入
6 加号 + 进入
7 乘号 * 进入
8 操作数2和^进入
9 操作数3和+进入
对此图中序遍历,所以选A
方法二
对4个选择逐一进行中缀表达式转后缀表达式,看是否和题目给出的后缀表达式: 6 2 3 + - 3 8 2 / + * 2 ^ 3 + 一致
A ((6 - (2 + 3)) * (3 + 8 / 2)) ^ 2 + 3
1按优先级加括号
((((6 - (2 + 3)) * (3 + (8 / 2)) ^ 2) + 3)
2把符合放到对应括号右边
((6 - (2 + 3)) * (3 + (8 / 2)))
(2 + 3) => 2 3 +
(6 - (2 + 3))=>6 2 3 + -
(8 / 2)=>8 2 /
(3 + (8 / 2)) => 3 8 2 / +
((6 - (2 + 3)) * (3 + (8 / 2))) = 6 2 3 + - 3 8 2 / + *
(((6 - (2 + 3)) * (3 + (8 / 2)) ^ 2)=6 2 3 + - 3 8 2 / + * 2 ^
((((6 - (2 + 3)) * (3 + (8 / 2)) ^ 2) + 3)=6 2 3 + - 3 8 2 / + * 2 ^ +
和题目给出后缀表达式一致
B 6 - 2 + 3 * 3 + 8 / 2 ^ 2 + 3
按优先级加括号
((((6 - 2) + (3 * 3)) + ((8 / 2) ^ 2)) + 3)
2把符合放到对应括号右边
(6 - 2)=> 6 2 -
(3 * 3)=>3 3 *
((6 - 2) + (3 * 3))=>6 2 - 3 3 * +
(8 / 2)=>8 2 /
((8 / 2) ^ 2) => 8 2 / ^
((((6 - 2) + (3 * 3)) + ((8 / 2) ^ 2)) => 6 2 - 3 3 * + 8 2 / ^ +
((((6 - 2) + (3 * 3)) + ((8 / 2) ^ 2)) + 3) => 6 2 - 3 3 * + 8 2 / ^ + 3 +
和题目给出后缀表达式不符
C 6 - (2 + 3)) * ((3 + 8 / 2) ^ 2) + 3
1按优先级加括号
(((6 - (2 + 3)) * ((3 + (8 / 2)) ^ 2)) + 3)
2把符合放到对应括号右边
(2 + 3) => 2 3 +
(6 - (2 + 3)) =>6 2 3 + -
(8 / 2) => 8 2 /
(3 + (8 / 2)) = 3 8 2 / +
((3 + (8 / 2)) ^ 2) =>3 8 2 / + 2 ^
((6 - (2 + 3)) * ((3 + (8 / 2)) ^ 2)) =>6 2 3 + - 3 8 2 / + 2 ^ *
(((6 - (2 + 3)) * ((3 + (8 / 2)) ^ 2)) + 3)=>6 2 3 + - 3 8 2 / + 2 ^ * 3 +
和题目给出后缀表达式不符
D 6 - ((2 + 3) * (3 + 8 / 2)) ^ 2 + 3
1按优先级加括号
((6 - (((2 + 3) * (3 + (8 / 2))) ^ 2)) + 3)
2把符合放到对应括号右边
(2 + 3)=>2 3 *
(8 / 2) => 8 2 /
(3 + (8 / 2)) => 3 8 2 / +
((2 + 3) * (3 + (8 / 2))) =>2 3 * 3 8 2 / + *
(((2 + 3) * (3 + (8 / 2))) ^ 2) =>2 3 * 3 8 2 / + * 2 ^
(6 - (((2 + 3) * (3 + (8 / 2))) ^ 2)) =>6 2 3 * 3 8 2 / + * 2 ^ -
((6 - (((2 + 3) * (3 + (8 / 2))) ^ 2)) + 3)=>6 2 3 * 3 8 2 / + * 2 ^ - 3 +
和题目给出后缀表达式不符
所以选择A
作者:newcode 更多资源请关注纽扣编程微信公众号
从事机器人比赛、机器人等级考试、少儿scratch编程、信息学奥赛等研究学习