信息学奥赛初赛天天练-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
posted @ 2024-06-09 20:50  new-code  阅读(1)  评论(0编辑  收藏  举报