题意

输入前序遍历序列字符串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;
} 

【华科考研机试题】二叉树遍历(递归版 详细注释)相关推荐

  1. 【华科考研机试题】阶乘

    题目 输入n, 求y1=1!+3!+-m!(m是小于等于n的最大奇数) y2=2!+4!+-p!(p是小于等于n的最大偶数). 解题思路 打表算最快,不用每个数据都算一次. 复杂度 时间复杂度(输入的 ...

  2. 【华科考研机试题】最长最短文本

    题目 输入多行字符串,请按照原文本中的顺序输出其中最短和最长的字符串,如果最短和最长的字符串不止一个,请全部输出. 解题思路 1.输入所有字符串(有空格不另算字符串). 2.将char*字符串转换成s ...

  3. 图解二叉树非递归版的中序遍历算法

    你会学到什么 讨论的问题是什么 这个问题相关的概念和理论 非递归版中序遍历算法 代码思考 算法技巧 实现代码 快照 评价算法 总结 欢迎关注算法思考与应用公众号 你会学到什么? 树的递归遍历算法很容易 ...

  4. 王道考研机试指南第2版——题目提交链接

    王道考研机试指南第2版--题目链接 文章来自https://github.com/zguolee/WDAlgorithmsNote/blob/master/README.md 王道考研机试指南第2版- ...

  5. 从头开始学算法:考研机试题练习(C/C++)–算法初步

    从头开始学算法:考研机试题练习(C/C++)–算法初步 最近重学C语言,刷的是胡凡写的<算法笔记>,这本书的题主要是面向考研机试和一般算法考试的,零基础入门,还不错,在此记录学习过程. 本 ...

  6. 从头开始学算法:考研机试题练习(C/C++)–STL使用

    从头开始学算法:考研机试题练习(C/C++)–STL使用 最近重学C语言,刷的是胡凡写的<算法笔记>,这本书的题主要是面向考研机试和一般算法考试的,零基础入门,还不错,在此记录学习过程. ...

  7. 2020年华科计算机考研机试题答案(没弄懂题目的意思)

    2020年华科研究生复试机试题,包含测试数据和题目,里面是文档和要所报文件.供考研学子学习使用.此数据量有点大,涉及到链表,数据转换,和容器.以下代码都是我写的,欢迎交流.原题目和测试文档链接地址是[ ...

  8. 图解二叉树非递归版的前序遍历算法

    " 图解用栈数据结构对树的前序遍历,中序遍历,后续遍历." 树的遍历 所谓遍历 (Traversal) 是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问.访问结点所做 ...

  9. 日期累加(北京理工大学考研机试题)

    文章目录 日期累加 日期类问题必备函数 AC代码 日期累加 本题链接:日期累加 本博客给出本题截图: 日期类问题必备函数 const int months[13] = {0, 31, 28, 31, ...

最新文章

  1. Flash完美跨域访问的方法
  2. python下载pip脚本显示file_generateScriptFile.py脚本使用过程中遇到的问题及解决
  3. SPOJ 287 Smart Network Administrator
  4. 最大似然估计的一个示例
  5. 利用多个域名来存储网站资源
  6. hdu 5419(数学期望)
  7. 抢票 | AI未来说学术论坛第八期 深度学习特别专场
  8. 设计高效sql一般经验谈
  9. php 递归展现城市信息,PHP 递归兑现层级树状展现数据
  10. C++自动类型推导 : auto 与 decltype 用法
  11. Python学习_字符串格式化
  12. netbeans html 格式化,在NetBeans中更改模板或HTML缩进
  13. 企业者的福音之8266接入阿里智能,点亮一盏灯
  14. 算法刷题指南,来自GitHub 68.8k star的硬核算法教程
  15. ACC 时间范围处理
  16. Centos6 安装 Redis 和集群配置
  17. springSecurity分离资源服务器分析
  18. 非常有用的150个生活小常识
  19. Youtube CC字幕是什么,Caption和Subtitle的解释
  20. 贪心法(作业调度问题)

热门文章

  1. matlab and操作,系统建模 | Control Tutorials for Matlab and Simulink
  2. 小程序input获得焦点触发_小程序如何获得种子用户,微信9亿月活用户来教你!...
  3. 每日程序C语言43-链表原地逆置
  4. 前端参数无法转为后端实体内部类_Java学到什么程度才能叫精通?
  5. 计算机道德 英语作文,公共道德英语作文
  6. javaWeb(1)
  7. spring事物回滚遇到的问题
  8. tomcat启动停止在 Initializing Spring root WebApplicationContext,就不运行了
  9. 类实现Java模板方法模式中的HookMethod实现
  10. ListView的分页显示