遍历

已知前序中序求后续;已知中序后序求前序;

青春壹個敷衍的年華 提交于 2020-02-27 18:32:52
后序遍历与中序遍历,求前序遍历 首先,一点基本常识,给你一个后序遍历,那么最后一个就是根(同理前序遍历,第一个是根) 那么这个算法的核心就是不断的求根; 接下来我用一个实例来说明怎样进行求根: 例如以上,给出后序遍历和中序遍历,求前序遍历 首先根据后序遍历的最后一个就是根,可以知道4是根,以此可将前序和后序都分为三部分; 看上图,在前序遍历中,绿色框中的4为根,则在4的左边,红色框的就为以4为根的左子树,黄色框的就是以4为根的右子树。 则在找到4这个根之后,此题可以转换为两个子问题,一下: 求红框的前序列,求黄框的前序列。 之后就可以递归了;我们再回到上面的图,再进行一个小小的思考; 观察前序遍历和后序遍历,都可以由三部分组成,红框的左子树,黄框的右子树以及绿框的根; 那么,在进行函数递归的时候,重点就是怎样计算各个部分的下标起始,来让程序可以递归下去; 上代码: 方法一: #include<cstdio> #include<iostream> #include<cstring> using namespace std; void beford(string in,string after){ if (in.size()>0){ char ch=after[after.size()-1]; cout<<ch;//找根输出 int k=in.find(ch); beford(in

从中序与后序遍历序列构造二叉树

大城市里の小女人 提交于 2020-02-27 14:56:04
根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 code:先中序中找到根后,可以根据根在中序中的位置划分左右子树的长度,根据中序中划分的左右子树的长度,在后序中划分左右子树,后序序列中:左、右、根。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { private: TreeNode* buildTreeCore(vector<int>& in,int inStart,int inEnd, vector<int>& post,int postStart,int postEnd) { if(inStart>inEnd||postStart>postEnd) return nullptr; TreeNode* root=new

高级变量

心不动则不痛 提交于 2020-02-27 12:31:08
回顾 Python中数据类型可以分为数字型和非数字型 数字型   整型   浮点型   布尔型   复数型(complex) 非数字型   字符串   列表   元组   字典 在Python中,所有非数字型变量都支持以下特点   1.都是一个序列sequence,也可以理解为容器   2.取值[]   3.遍历 for in   4.计算长度、最大/最小、比较、删除   5.链接 + 和重复 *   6.切片 列表 列表(list)是Python中使用最频繁的数据类型,在其他语言中通常叫做数组 专门用于存储一串信息 列表用[]定义,数据之间使用,分隔 列表的索引从0开始   索引就是数据在列表中的位置编号,索引又可以被称为下标  注意:从列表中取值时,如果超出索引范围,程序会报错 列表取值 列表名[索引值]  #索引超出范围会报错 列表取索引 列表名.index(“想确定的值”)  #传递的数据不在列表中,程序会报错 修改列表的值 列表名[要修改值的索引] = “要修改的值”  #索引超出范围,程序报错 列表增加数据 列表名.append("添加的数据")  #向列表末尾追加数据 列表名.insert(索引值,“添加的数据”)  # 向指定的索引位置添加数据 列表名.extend(列表名)  #将其他列表中的完整内容追加到当前列表末尾 列表的删除 列表名.remove(

Day 14 集合框架

痴心易碎 提交于 2020-02-27 06:25:25
1:集合的由来? 2:集合和数组的区别? 3:Collection集合的功能概述? 4:Collection集合存储字符串并遍历?(迭代器) 5:Collection集合存储自定义对象并遍历?(迭代器) 6:List集合的特有功能? 7:List集合存储字符串并遍历?(迭代器和普通for) 8:List集合存储自定义对象并遍历?(迭代器和普通for) 9:并发修改异常出现的原因?解决方案? 10:常见的数据结构的特点? 数组: 链表: 11:List集合的子类特点 ArrayList: Vector: LinkedList: 12:List的三个儿子你准备使用谁?请说明理由。 来源: oschina 链接: https://my.oschina.net/u/4258973/blog/3164996

Map解析

喜欢而已 提交于 2020-02-27 05:11:19
Java中最常用的集合类是List和Map Map集合类用于存储键值对,每个键映射到一个值。 一:Map用法: 初始化: Map<String, String> map = new HashMap<String, String>(); 插入元素: map.put("key1", "value1"); 获取元素: map.get("key1"); 移除元素: map.remove("key1"); 清空map: map.clear(); 二:Java中遍历map对象的四种方式: public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); map.put("1", "value1"); map.put("2", "value2"); map.put("3", "value3"); //第一种:普遍使用,二次取值 System.out.println("通过Map.keySet遍历key和value:"); for (String key : map.keySet()) { System.out.println("key= "+ key + " and value= " + map.get(key)); } //第二种 System.out

做了几年程序员,某天居然发现自己没学过数据结构。。。

左心房为你撑大大i 提交于 2020-02-27 03:06:10
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者。 简介 学习编程,数据结构是你必须要掌握的基础知识,那么数据结构到底是什么呢? 根据百度百科的介绍,数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。 听听这是人话么,我帮你们翻译一下,其实数据结构就是用来描述计算机里存储数据的一种数学模型,因为计算机里要存储很多乱七八糟的数据,所以也需要不同的数据结构来描述。 本文思维导图 为什么要学数据结构 了解了基本概念之后,接下来我们再来看看,为什么我们要学习数据结构呢? 在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。 许多时候,确定了数据结构后,算法就容易得到了。有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。不论哪种情况,选择合适的数据结构都是非常重要的。 选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。 也就是说,选定数据结构往往是解决问题的核心,比如我们做一道算法题

Map遍历之Entry

让人想犯罪 __ 提交于 2020-02-27 02:26:19
Entry是Map接口的一个内部接口,作用是当Map集合一创建,就会在Map集合中创建一个Entry对象,用来记录键和值(键值和对象,键和值的映射关系) Map集合遍历的第二中方式:使用Entry进行遍历 Map集合中的方法: Set<Map.Entry<K,V>> entrySet() 返回此映射中包含的映射关系的set视图 1、使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个set集合中 2、遍历set集合,获取每一个Entry对象 3、使用Entry对象中的getKey()和getValue()获取键和值 import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class demo3Entry { public static void main(String[] args){ //创建map集合对象 Map<String,Integer> map = new HashMap<>(); map.put("诸葛亮",1); map.put("刘伯温",2); map.put("张良",3); map.put("东方朔",4); //1、使用Map集合中的方法entrySet()

MySQL之LEFT JOIN问题汇总

情到浓时终转凉″ 提交于 2020-02-26 21:55:25
使用ON和WHRERE对表数据过滤 背景 left join在我们使用mysql查询的过程中可谓非常常见,比如博客里一篇文章有多少条评论、商城里一个货物有多少评论、一条评论有多少个赞等等。但是由于对join、on、where等关键字的不熟悉,有时候会导致查询结果与预期不符,所以今天我就来总结一下,一起避坑。 这里我先给出一个场景,并抛出两个问题,如果你都能答对那这篇文章就不用看了。 假设有一个班级管理应用,有一个表classes,存了所有的班级;有一个表students,存了所有的学生,具体数据如下(在线SQL: https://www.liaoxuefeng.com/wiki/1177760294764384/1179611432985088): SELECT * FROM classes; id name 1 一班 2 二班 3 三班 4 四班 SELECT * FROM students; id class_id name gender 1 1 小明 M 2 1 小红 F 3 1 小军 M 4 1 小米 F 5 2 小白 F 6 2 小兵 M 7 2 小林 M 8 3 小新 F 9 3 小王 M 10 3 小丽 F 那么现在有两个需求: 1、找出每个班级的名称及其对应的女同学数量 2、找出一班的同学总数 对于需求1,大多数人不假思索就能想出如下两种sql写法,请问哪种是对的?

做了几年程序员,某天居然发现自己没学过数据结构。。。

孤街浪徒 提交于 2020-02-26 21:52:17
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者。 简介 学习编程,数据结构是你必须要掌握的基础知识,那么数据结构到底是什么呢? 根据百度百科的介绍,数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。 听听这是人话么,我帮你们翻译一下,其实数据结构就是用来描述计算机里存储数据的一种数学模型,因为计算机里要存储很多乱七八糟的数据,所以也需要不同的数据结构来描述。 本文思维导图 为什么要学数据结构 了解了基本概念之后,接下来我们再来看看,为什么我们要学习数据结构呢? 在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。 许多时候,确定了数据结构后,算法就容易得到了。有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。不论哪种情况,选择合适的数据结构都是非常重要的。 选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。 也就是说,选定数据结构往往是解决问题的核心,比如我们做一道算法题

数据结构-图和图遍历(DFS、BFS)

ⅰ亾dé卋堺 提交于 2020-02-26 20:13:45
一、图的定义和相关术语 图是由顶点(Vertex)和边(Edge) 图可以分为有向图和无向图,无向图所有边都是双边的 顶点的度是指该顶点相连的边的条数,特别是对于有向图的边数称为顶点的出度,顶点的入边条数称为该顶点的入度。 顶点和边都可以有一定的属性,量化的属性称为权值,顶点的权值和边的权值分别称为点权和边权。 二、图的存储 一般图来说存储方式有两种: 邻接矩阵 和 邻接表 邻接矩阵 ,本质上是一个二维数组,里面可以存放权值,但是是开辟了一个二维数组,不能够开辟很大的,一般的结点数不能超过 1000 。 邻接表 , N个顶点就会有N个列表,常常使用vector来实现邻接表。 vector<int> Adj[N]; Adj[1].push_back(3); struct Node{ int v; int w; }; vector<Node> Adj[N]; //如果想添加边 Node temp; temp.v = 3; temp.w = 4; Adj[1].push_back(temp); //更快的方式,用定义结构体Node时构造函数 struct Node{ int v, w; Node(int _v, int _w) : v(_v), w(_w) {} } //这样就可以不用定义临时变量 Adj[1].push_back(Node(3, 4)); 三、图的遍历