【华科考研机试题】二叉树遍历(递归版 详细注释)
题意
输入前序遍历序列字符串a,中序遍历字符串b,输出后序遍历字符串。
解题思路
1.已知前序遍历,中序遍历求后序遍历,常规做法是建立一棵树。
2.用手算的话很简单,将字符串a遍历一遍,依次插入到树中。
插入关键代码如下
for(a[i] in a){//插入a[i]int flag = 1;// 标志位为1表示a[i]还未插入设置p指针指向根结点 while(flag){if(a[i]比p指向的结点的字母 在b字符串 中的索引小){if(p->left为空){将a[i]插入到p->left位置 flag = 0; //a[i]插入完成,跳出循环 }else{p指向p->left }} else{//a[i]比p指向的结点的字母 在b字符串 中的索引大 if(p->right为空){将a[i]插入到p->right位置 flag = 0; //a[i]插入完成,跳出循环 }else{p指向p->right }}}
}
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;struct node{char val;node* left;node* right;
};
node* root;
string a,b;//如果c在x左边,返回1
bool InLeft(char x, char c){for(int i = 0;b[i]; ++i){if(b[i] == x){return 0;}if(b[i] == c){return 1;}}return 0; //此句理解起来可忽略,删掉牛客网编译器会报错。
}void insert(char c){node* p = root;//flag为1表示c未插入到树中 int flag = 1;//为即将插入的结点申请空间 node* newNode = (node*)malloc(sizeof(node));newNode->left = NULL;newNode->right = NULL;newNode->val = c;while(flag){//如果c 在当前结点p的左边(在b中的相对位置) if(InLeft(p->val, c)){//如果当前结点p的左子树不为空 if(p->left){p = p->left;}else{p->left = newNode;flag = 0;}}else{if(p->right){p = p->right;}else{p->right = newNode;flag = 0;}}}
}//后续遍历的递归(偷懒)写法,非递归得用栈
void dfs(node* root){if(!root) return;if(root->left) dfs(root->left);if(root->right) dfs(root->right);cout << root->val;
}int main() {ios::sync_with_stdio(false);while(cin >> a >> b){root = (node*)malloc(sizeof(node)); //如果a字符串不为空,将第一个字母设置为根结点字母 if(a[0]) root->val = a[0], root->left = NULL, root->right = NULL;//遍历a字符串后续字母,依次插入到树中 for(int i = 1;a[i]; ++i){insert(a[i]);}//后序遍历输出树 dfs(root);cout << endl;}return 0;
}
【华科考研机试题】二叉树遍历(递归版 详细注释)相关推荐
- 【华科考研机试题】阶乘
题目 输入n, 求y1=1!+3!+-m!(m是小于等于n的最大奇数) y2=2!+4!+-p!(p是小于等于n的最大偶数). 解题思路 打表算最快,不用每个数据都算一次. 复杂度 时间复杂度(输入的 ...
- 【华科考研机试题】最长最短文本
题目 输入多行字符串,请按照原文本中的顺序输出其中最短和最长的字符串,如果最短和最长的字符串不止一个,请全部输出. 解题思路 1.输入所有字符串(有空格不另算字符串). 2.将char*字符串转换成s ...
- 图解二叉树非递归版的中序遍历算法
你会学到什么 讨论的问题是什么 这个问题相关的概念和理论 非递归版中序遍历算法 代码思考 算法技巧 实现代码 快照 评价算法 总结 欢迎关注算法思考与应用公众号 你会学到什么? 树的递归遍历算法很容易 ...
- 王道考研机试指南第2版——题目提交链接
王道考研机试指南第2版--题目链接 文章来自https://github.com/zguolee/WDAlgorithmsNote/blob/master/README.md 王道考研机试指南第2版- ...
- 从头开始学算法:考研机试题练习(C/C++)–算法初步
从头开始学算法:考研机试题练习(C/C++)–算法初步 最近重学C语言,刷的是胡凡写的<算法笔记>,这本书的题主要是面向考研机试和一般算法考试的,零基础入门,还不错,在此记录学习过程. 本 ...
- 从头开始学算法:考研机试题练习(C/C++)–STL使用
从头开始学算法:考研机试题练习(C/C++)–STL使用 最近重学C语言,刷的是胡凡写的<算法笔记>,这本书的题主要是面向考研机试和一般算法考试的,零基础入门,还不错,在此记录学习过程. ...
- 2020年华科计算机考研机试题答案(没弄懂题目的意思)
2020年华科研究生复试机试题,包含测试数据和题目,里面是文档和要所报文件.供考研学子学习使用.此数据量有点大,涉及到链表,数据转换,和容器.以下代码都是我写的,欢迎交流.原题目和测试文档链接地址是[ ...
- 图解二叉树非递归版的前序遍历算法
" 图解用栈数据结构对树的前序遍历,中序遍历,后续遍历." 树的遍历 所谓遍历 (Traversal) 是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问.访问结点所做 ...
- 日期累加(北京理工大学考研机试题)
文章目录 日期累加 日期类问题必备函数 AC代码 日期累加 本题链接:日期累加 本博客给出本题截图: 日期类问题必备函数 const int months[13] = {0, 31, 28, 31, ...
最新文章
- Flash完美跨域访问的方法
- python下载pip脚本显示file_generateScriptFile.py脚本使用过程中遇到的问题及解决
- SPOJ 287 Smart Network Administrator
- 最大似然估计的一个示例
- 利用多个域名来存储网站资源
- hdu 5419(数学期望)
- 抢票 | AI未来说学术论坛第八期 深度学习特别专场
- 设计高效sql一般经验谈
- php 递归展现城市信息,PHP 递归兑现层级树状展现数据
- C++自动类型推导 : auto 与 decltype 用法
- Python学习_字符串格式化
- netbeans html 格式化,在NetBeans中更改模板或HTML缩进
- 企业者的福音之8266接入阿里智能,点亮一盏灯
- 算法刷题指南,来自GitHub 68.8k star的硬核算法教程
- ACC 时间范围处理
- Centos6 安装 Redis 和集群配置
- springSecurity分离资源服务器分析
- 非常有用的150个生活小常识
- Youtube CC字幕是什么,Caption和Subtitle的解释
- 贪心法(作业调度问题)
热门文章
- matlab and操作,系统建模 | Control Tutorials for Matlab and Simulink
- 小程序input获得焦点触发_小程序如何获得种子用户,微信9亿月活用户来教你!...
- 每日程序C语言43-链表原地逆置
- 前端参数无法转为后端实体内部类_Java学到什么程度才能叫精通?
- 计算机道德 英语作文,公共道德英语作文
- javaWeb(1)
- spring事物回滚遇到的问题
- tomcat启动停止在 Initializing Spring root WebApplicationContext,就不运行了
- 类实现Java模板方法模式中的HookMethod实现
- ListView的分页显示