Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数据结构回顾及展望(一)

数据结构回顾及展望(一)

作者头像
glm233
发布于 2020-09-28 02:17:56
发布于 2020-09-28 02:17:56
36400
代码可运行
举报
运行总次数:0
代码可运行

万丈高楼平地起

难题也由水题起

只有珍惜自己是小兵的日子,才能成为如将军般运筹帷幄之中,决胜千里之外------------前言

树形数据结构

P1087 FBI树

P1030 求先序排列

P1305 新二叉树

FBI树解析:后序遍历的模板

一般后序遍历的代码是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
​​​void postbintree(node*p)
{   
   if(!p)return ;
   postbintree(p->leftchild);
   postbintree(p->rightchild);
   cout<<p->data<<" ";
}
​​​

按图索骥,此题也是一个道理

实际上读入的n没有用,起作用的是字符串,按题目要求,不断对字符串进行二等分,按照后序遍历思想操作即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<bits/stdc++.h>
using namespace std;
int n;
string s;
char fbi(string s)
{
    if(s.length()>1)
    {
        cout<< fbi(s.substr(0,s.length()/2));
        cout<< fbi(s.substr(s.length()/2,s.length()/2));
    }
    if(s==string(s.length(),'0'))return 'B';
    if(s==string(s.length(),'1'))return 'I';
   return 'F';
}
int main()
{
cin>>n>>s;
cout<<fbi(s);
    return 0;
}

求先序遍历题目的思想也类似,但要注意已知先序和中序推得后序,中序和后序可以推得先序,但先序和后序不能推得中序

献上很短的递归代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<bits/stdc++.h>
using namespace std;
string a,b;
void dfs(int l1,int r1,int l2,int r2)
{
      int m=a.find(b[r2]);
      cout<<a[m];
      if(m>l1)dfs(l1,m-1,l2,r2-(r1-m)-1);
      if(m<r1)dfs(m+1,r1,l2+m-r1,r2-1);
      return ;
}
int main()
{
cin>>a>>b;
dfs(0,a.size()-1,0,b.size()-1);
    return 0;
}

解释几个难点,按照题目要求我只知道中序和后序,那后序最后一个一定在中序的位置是它的左子树和右子树的分界线

我只要找到了这个位置并记录下来,在中序排列中这个位置-起始点=这个位置的data所代表的父节点的左子树长度,结束点-在中序排列中这个位置=这个位置的data所代表的父节点的右子树长度,又依据后序遍历是左子树,右子树,根节点的顺序,我只要将下次递归的范围改成后序遍历起点到(结束点-右子树长度)即可,当然要记得-1,因为我们输出了一个结点信息,它的使命已经完成

新二叉树分析:

可以采用stl的字符串函数

这个题可以算是二叉树的模板题吧。

首先要明白二叉树中先序,中序,后序遍历的概念。

其实这里的先,中,后都是根节点出现的位置,其他都是左子树先于右子树遍历。注意这里左子树和右子树也适合子树,也就是说遍历是递归进行的。

例如样例:

先序为 abdicj

中序为 dbjacj

后序为 dbicja

由于此题字符串第一个默认根节点,又是按顺序来的先序遍历,,所以很好水过

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<bits/stdc++.h>
using namespace std;
int n;
string s;
int main()
{
cin>>n>>s;
for(int i=2;i<=n;i++)
{
    string sontree;
    cin>>sontree;
    int k=s.find(sontree[0]);
    s.erase(k,1);
    s.insert(k,sontree);
}
for(int i=0;i<(signed)s.size();i++)
{
    if(s[i]=='*')continue;
    cout<<s[i];
}
    return 0;
}

但如果不是第一个要怎么办呢?思路:记录树中每个节点的父亲,最后在遍历一遍找到没有父亲的节点即为根节点

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/03/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ES6基础-ES6的扩展
编辑器(VS Code, Atom,Sublime)或者IDE(Webstorm)
达达前端
2019/11/26
5450
「ES6基础」你需要知道的Array数组新方法(上)
在日常工作中我们经常会与数组打交道,因此需要熟练掌握数组操作的相关方法,ES6中关于数组的操作,又给我们带来了哪些惊喜呢,Array数组操作又添加了哪些新方法?
前端达人
2019/07/17
7580
「ES6基础」你需要知道的Array数组新方法(上)
ES6的语法
世间万物皆对象
2024/03/20
1840
ES6中数组做了哪些新扩展?
ES6通过扩展元素符...,好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列
用户6256742
2024/07/15
990
【ES6基础】Array数组的新方法(上)
在日常工作中我们经常会与数组打交道,因此需要熟练掌握数组操作的相关方法,ES6中关于数组的操作,又给我们带来了哪些惊喜呢,Array数组操作又添加了哪些新方法?
前端达人
2019/07/13
9030
【ES6基础】Array数组的新方法(上)
ES6学习笔记(一)
ES6的标准发布很久了,ES7和ES8已经出来了,直到现在才开始学习,已经有点晚了,希望可以赶得上吧。
CherishTheYouth
2019/07/30
5780
ES6学习笔记(一)
ES6、ES7、ES8学习指南
ES全称ECMAScript,ECMAScript是ECMA制定的标准化脚本语言。目前JavaScript使用的ECMAScript版本为ECMAScript-262。
CrazyCodeBoy
2018/10/09
1.7K0
JavaScript 又出新特性了?来看看这篇就明白了
https://juejin.im/post/5ca2e1935188254416288eb2
崔庆才
2019/05/06
1.6K0
ES6/ES7/ES8/ES9/ES10常用特性和新特性
变量的改变,添加了块级作用域的概念 let声明变量(块级作用域),let是更完美的var,它声明的全局变量不是全局属性widow的变量,这便解决了for循环中变量覆盖的问题 const声明常量(会计作用域)
公众号---人生代码
2020/06/28
1.5K0
ES6新特性
ES6的常用新特性简介,全部特性可参阅 Ecma-International MDN ES6入门 ES6 教程
WindRunnerMax
2020/08/27
7900
ECMAScript 6 笔记(二)
  用两个双字节的形式表达字符时,如果直接在\u后面跟上超过0xFFFF的数值(比如\u20BB7),JavaScript会理解成\u20BB+7。由于\u20BB是一个不可打印字符,所以只会显示一个空格,后面跟着一个7。
超然
2018/08/03
8140
ES6技术
JavaScript之前是LiveScript,具体的资料,大家自己查一下百度。网景公司的语言,这个公司为了把自己的公司语言,走出美国,迈向世界。把自己的语言提交给了ECMA。
张哥编程
2024/12/19
1070
ES6技术
ES6中数组新增扩展盘点
ES6通过扩展元素符...,好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列
@超人
2021/07/05
5730
ES6中数组新增扩展盘点
ES6总结
书到用时方恨少啊 于是2022年的规划又多了一项:多看书 不积跬步无以至千里 不积小流无以成江海
小吕
2022/09/26
6030
Javascript数组方法(ES5-ES6)
join(speparator):将数组的元素组起一个字符串,spearator为分隔符,省略的话则用默认用逗号为分隔符,该方法只接收一个参数,即分隔符。
用户9298250
2021/12/29
1.1K0
常见的数组基本用法
ES5方法:pop push shift unshift reverse sort splice
前端迷
2021/04/09
9450
JavaScript——ES6新增语法特性
ES的全称是ECMAScript,它是由ECMA国际标准化组织制定的一项脚本语言的标准化规范
岳泽以
2022/10/26
4330
JavaScript——ES6新增语法特性
ES6 数组方法归纳整理
Array.from() 可接收三个参数,第一个参数为类数组对象,第二个参数为映射函数,如果使用了映射函数,可以传第三个参数表示映射函数的this值。
全栈程序员站长
2022/06/27
6000
ES7、ES8、ES9、ES10、ES11、ES12新特性大全!
如果fromIndex为负值,使用数组长度 + fromIndex计算出的索引作为新的fromIndex,如果新的fromIndex为负值,则搜索整个数组。
zz_jesse
2024/07/04
3150
ES7、ES8、ES9、ES10、ES11、ES12新特性大全!
从零开始学 Web 之 ES6(六)ES6基础语法四
在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识点,期间也会分享一些好玩的项目。现在就让我们一起进入 Web 前端学习的冒险之旅吧!
Daotin
2018/09/30
4670
相关推荐
ES6基础-ES6的扩展
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验