当前位置: 首页 > news >正文

【2017年数据结构真题】

请设计一个算法,将给定的表达式树(二叉树)转换成等价的中缀表达式(通过括号反映次序),并输出。例如,当下列两棵表达式树作为算法的输入时:

image.png

输出的等价中缀表达式分别为(a+b)(a(-d)) 和 (a * b)+(-(c-d))

二叉树结点定义如下:

typedef struct node
{char date[10]; //存储操作数或者操作符struct node *left, *right;
} BTree;

要求:

(1) 给出算法的基本思想

(2) 根据设计思想,采用c/c++语言描述算法,关键之处给出注释

算法思想:基于二叉树的中缀遍历,添加适当括号,显然,表达式的最外层(对于根节点)及操作数

(对应叶节点)不需要添加括号(这句是答案说的,其实不太懂)


void B2E(BTree *root)
{B2E(root, 1);
}
void B2E(BTree *root, int deep)
{if (root == NULL)printf("NULL");else if (root->left == NULL && root->right == NULL) //叶节点printf("%s", root->data);                       //输出操作数else{if (deep > 1)printf("(");B2E(root->left, deep + 1);printf("%s", root->data); //输出操作符B2E(root->right, deep + 1);if (deep > 1)printf(")");}
}

解决方法:

(1)算法的基本设计思想

表达式树的中序序列加上必要的括号即为等价的中缀表达式。可以基

于二叉树的中序遍历策略得到所需的表达式。(3 分)

表达式树中分支结点所对应的子表达式的计算次序,由该分支结点所

处的位置决定。为得到正确的中缀表达式,需要在生成遍历序列的同

时,在适当位置增加必要的括号。显然,表达式的最外层(对应根结点)

及操作数(对应叶结点)不需要添加括号。(2 分)

(2)算法实现(10 分)

将二叉树的中序遍历递归算法稍加改造即可得本题答案。除根结点和

叶结点外,遍历到其他结点时在遍历其左子树之前加上左括号,在遍

历完右子树后加上右括号。

相关文章:

  • 基于springboot实现应急救援物资管理系统项目【项目源码】计算机毕业设计
  • 面试求职者
  • 在Ubuntu上用sane api实现通用扫描功能
  • 8.5 Windows驱动开发:内核注册表增删改查
  • 基于单片机体温脉搏检测控制系统及源程序
  • Linux控制---进程程序替换
  • [内存泄漏][PyTorch](create_graph=True)
  • CCRC认证是什么?
  • NewStarCTF2023 Reverse Week3 EzDLL WP
  • 【自留地】后端 - PHP - MySQL - Nginx - Python - Java
  • 算法通关村第十一关-青铜挑战理解位运算的规则
  • 云原生是整个信息化行业的未来,一文彻底搞懂云原生
  • 【Go入门】 Go如何使得Web工作
  • 提升工作效率,打造精细思维——OmniOutliner 5 Pro for Mac
  • Spring Cloud学习(十)【Elasticsearch搜索功能 分布式搜索引擎02】
  • 【面试系列】之二:关于js原型
  • angular学习第一篇-----环境搭建
  • exports和module.exports
  • IOS评论框不贴底(ios12新bug)
  • JavaScript创建对象的四种方式
  • Odoo domain写法及运用
  • Vue小说阅读器(仿追书神器)
  • 初探 Vue 生命周期和钩子函数
  • 跨域
  • 普通函数和构造函数的区别
  • 前端相关框架总和
  • 使用 QuickBI 搭建酷炫可视化分析
  • 译有关态射的一切
  • 最近的计划
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 《码出高效》学习笔记与书中错误记录
  • #Linux(帮助手册)
  • $$$$GB2312-80区位编码表$$$$
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (¥1011)-(一千零一拾一元整)输出
  • (27)4.8 习题课
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (十八)SpringBoot之发送QQ邮件
  • (五)MySQL的备份及恢复
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)iOS字体
  • (转载)PyTorch代码规范最佳实践和样式指南
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .gitignore文件—git忽略文件
  • .Net mvc总结
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .Net小白的大学四年,内含面经
  • .NET正则基础之——正则委托
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [AIGC] 开源流程引擎哪个好,如何选型?
  • [Angular 基础] - 数据绑定(databinding)
  • [C#]手把手教你打造Socket的TCP通讯连接(一)