遍历

前序遍历、中序遍历和后序遍历

半腔热情 提交于 2020-02-04 06:52:19
前序遍历: 前序遍历就像是从根节点出发的一个小人围着树跑了一圈 中序遍历 中序遍历就像是树画好之后在底下的投影 比如这个图,中序遍历的结果就是HDIBEJAFKCG 后序遍历: 后续遍历就像剪葡萄,将葡萄一颗颗的剪下来 比如这个图:HIDJEBKFGCA 来源: CSDN 作者: minastinis of king 链接: https://blog.csdn.net/qq_40971025/article/details/104152382

数据结构——二叉树(基础)

巧了我就是萌 提交于 2020-02-04 05:02:30
1、树存在意义: 1)数组的存储方式的分析 优点:通过下标方式访问元素,速度快,对于有序数组,还可使用二分查找提高检索速度。 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率低。 2)链式存储方式的分析 优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,连接到链表即可,删除效率也很好)。 缺点:在进行检索时,效率仍然很低,检索某个值,需要从头节点开始遍历。 3)树的存储方式分析 能提高存储,读取的效率,比如利用二叉排序树(Binary Sort Tree),既可以保证数据的检索速度,同事也可以保证数据的插入,删除,修改的速度 2、树的常用术语: 节点 :如A,B,F分别是树的节点; 根节点 :如A是整棵树的根节点; 父节点 :如B是E的父节点; 子节点 :如E是B的子节点; 叶子节点 :没有子节点的节点,如D.H,F,G都是叶子节点; 权 :若将树中节点赋给一个有着某种含义的数值,则这个数值称为该结点的权; 路径 :从root结点(根节点)找到该节点的路线,如H节点的路径为{A,B,E,H}; 层 :从根开始定义起,根为第一层,根的孩子为第二层。若某节点在第k层,则其子树的就在第k+1 层。如节点E的层数为3; 子树 :如集合{B,D,E,H}为A的一颗子树; 树的高度 :树的最大层数,如示例图树的高度为4; 森林 :是m (m>

345. 反转字符串中的元音字母

孤人 提交于 2020-02-04 02:57:51
解题思路: 1.先将字符串转成字符数组 2.分别从前后遍历字符数组,如果前后都遍历到了元音字母,就交换两个字符,否则,就继续下一次遍历,直到前后都遍历到了元音字母 3.将字符数组转字符串 代码实现: class Solution { public String reverseVowels(String s) { //元音字母:a,e,i,o,u(区分大小写) int len=s.length(); int i=0;//从前向后遍历 int j=len-1;//从后向前遍历 char[] num=new char[200]; num['a']=1; num['e']=1; num['i']=1; num['o']=1; num['u']=1; num['A']=1; num['E']=1; num['I']=1; num['O']=1; num['U']=1; //字符串转字符数组 char[] arr = s.toCharArray(); while(i<j){ if(num[arr[i]]==0){ i++; continue; } if(num[arr[j]]==0){ j--; continue; } //交换i和j处的字符 char temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; i++; j--; } //字符数组转字符串 s

js数组

会有一股神秘感。 提交于 2020-02-04 02:46:43
数组 概念:是一个有序是数据集合,可以通过数组的名称(name)或者索引(index)访问数组中的数据内容。数组中的每一项可以存储任何类型的数据,也就是说,一个数组中可以存储不同类型的数据。 数组的声明: 字面量/直接量方式创建数组 语法: var 数组名 = [] Array() 函数方式创建数组 语法: var 数组名 = Array() 构造函数方式创建数组 语法: var 数组名 = new Array() 二维数组 概念:由于 JavaScript 语言中的数组存储的数据类型可以是任何数据类型,所以数组中存储另一个数组也是允许的。这种数组的嵌套结构成为多维数组。 遍历数组: for循环遍历 var a = [ 1 , 2 , 3 , 4 , 5 ] ; for ( var b = 1 ; b < a . length ; b ++ ) { console . log ( a [ b ] ) } 增强for循环遍历 var a = [ 1 , 2 , 3 , 4 , 5 ] ; for ( var i in a ) { console . log ( i ) } 来源: CSDN 作者: 语录晨话 链接: https://blog.csdn.net/weixin_45736498/article/details/104154900

java中高级面试题

对着背影说爱祢 提交于 2020-02-04 01:59:58
JVM JVM内存模型结构 方法区和直接内存什么时候会oom? JVM收集器G1的内存模型和CMS的内存模型有什么不同? jvm调优用过吗? 如何查看java内存使用情况(jconsole、命令jmap、jstack等等) 集合 Arraylist、linkedlist差异,应用场景; HashMap在JDK1.8有哪些改动? HashCurrentMap和HashMap的区别在哪里? Hashmap什么时候使用红黑树? 多线程 线程的几种状态,请画出具体的状态流转图? Java wait、sleep的区别? volatile如何实现指令重排序? 线程池中的阻塞队列如果满了怎么办(拒绝策略)? Synchronized和AQS异同,AQS公平非公平如何实现; 多线程里面对一个整型做加减为啥不能用volatile; voliatile和synchonized有什么区别?synchonized和jdk提供的Lock包又有什么区别? 算法 二叉树宽度遍历 红黑树 数据结构的话,链表,树,图的基本知识得懂 了解树的先序遍历,中序遍历,后序遍历。图的广度优先搜索算法,深度优先搜索算法。 动态规划、贪婪算法 来源: CSDN 作者: 码农部落格 链接: https://blog.csdn.net/semenry/article/details/104157164

C# 二维数组行列遍历

会有一股神秘感。 提交于 2020-02-04 01:07:14
C#学习 C#基础 二维数组行列遍历 属性 方法 C#基础 二维数组行列遍历 图片: 属性 int count1 = student.Length;//获取到的是整个二维数组的长度,所有元素长度总和 int row = student.Rank;//获取维数,这里指行数 方法 int col = student.GetLength(1);//获取指定维度中元素的个数,即列数了。 int col2 = student.GetUpperBound(0) + 1;//获取指定维度的索引上限,在加上一个1就是总数,这里表示二维数组的行数 来源: CSDN 作者: 十五啊十五 链接: https://blog.csdn.net/Zhangl15/article/details/104159941

ios runtime(1)

人走茶凉 提交于 2020-02-04 00:25:07
import import 我们前面已经讲过一篇runtime 原理,现在这篇文章主要介绍的是runtime是什么以及怎么用!希望对读者有所帮助! 首先,第一个问题, 1》runtime实现的机制是什么,怎么用,一般用于干嘛? 这个问题我就不跟大家绕弯子了,直接告诉大家, runtime是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API。 在我们平时编写的OC代码中, 程序运行过程时, 其实最终都是转成了runtime的C语言代码, runtime算是OC的幕后工作者 比如说,下面一个创建对象的方法中, 举例: OC : [[MJPerson alloc] init] runtime : objc_msgSend(objc_msgSend(“MJPerson” , “alloc”), “init”) 第二个问题 runtime 用来干什么呢??用在那些地方呢?怎么用呢? runtime是属于OC的底层, 可以进行一些非常底层的操作(用OC是无法现实的, 不好实现) 在程序运行过程中, 动态创建一个类(比如KVO的底层实现) 在程序运行过程中, 动态地为某个类添加属性\方法, 修改属性值\方法 遍历一个类的所有成员变量(属性)\所有方法 例如:我们需要对一个类的属性进行归档解档的时候属性特别的多,这时候,我们就会写很多对应的代码

数据结构与算法(树)

≡放荡痞女 提交于 2020-02-03 22:24:42
首语 疫情严重,需要多多注意,做好防范!戴口罩,勤洗手。献上→ 新型冠状病毒感染防护手册 ! 树 树(Tree)是n(n≥0)个结点的有限集。n=0时称为空树。在任意一颗非空树中:(1)有且仅有一个特定的称为根(Root)的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、…Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。 结点的度 结点拥有的子树数称为结点的度。度为0的节点称为叶子结点或终端结点,度不为0的结点称为非终端结点或分支结点。除根结点以外,分支结点也称为内部结点。树的度是树内各节点的度的最大值。 层次与深度 结点的层次(Level)从根开始定义起,根为第一层,根的孩子为第二层。若某结点在第一层,则其子树的根就在l+1层。其双亲在同一层的结点互为堂兄弟。显然图中的D、E、F是堂兄弟,而G、H、I、J也是。树中结点的最大层次称为树的深度(Depth)或高度,当前树的深度为4。 有序与无序树 如果将树中结点的各子树看成从左至右是有次序的,不能互换的,则称该树为有序树,否则称为无序树。 森林 森林(Forest)是m(m≥0)棵互不相交的树的集合。 树的存储结构 简单的顺序存储不能满足树的实现。 结合顺序存储和链式存储来实现。 三种表示方法 1、双亲表示法 在每个结点中,附设一个指示器指示其双亲结点到链表中的位置。 2

最短无序连续子数组

你。 提交于 2020-02-03 22:00:42
给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。 你找到的子数组应是最短的,请输出它的长度。 输入: [2, 6, 4, 8, 10, 9, 15] 输出: 5 解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。 方法一:排序算法 这个方法就是将原有数组拷贝为一个新的数组 然后去比较这两个数组最左边和最右边不匹配的元素 class Solution { public int findUnsortedSubarray ( int [ ] nums ) { int [ ] numsSort = nums . clone ( ) ; Arrays . sort ( numsSort ) ; int start = nums . length ; int end = 0 ; for ( int i = 0 ; i < nums . length ; i ++ ) { if ( nums [ i ] != numsSort [ i ] ) { start = Math . min ( start , i ) ; end = Math . max ( end , i ) ; //返回end和i中较大的数 } } return end - start > 0 ? end - start + 1

二叉树

蓝咒 提交于 2020-02-03 12:28:17
在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。一棵深度为k,且有2^k-1个结点的二叉树,称为满二叉树。这种树的特点是每一层上的结点数都是最大结点数。而在一棵二叉树中,除最后一层外,若其余层都是满的,并且或者最后一层是满的,或者是在右边缺少连续若干结点,则此二叉树为完全二叉树。具有n个结点的完全二叉树的深度为floor(log2n)+1。深度为k的完全二叉树,至少有2k-1个叶子结点,至多有2k-1个结点。 在这里不说那么深了,只是想记录一下我所学的二叉树的遍历,分为前序遍历,中序遍历,后序遍历,这里我用链式储存表示,首先是要懂得二叉树的数据表示方式。 # include <iostream> # include <stdlib.h> # include <stdio.h> # include <cstdio> typedef char DataType ; struct BinTreeNode ; typedef struct BinTreeNode * PBinTreeNode ; //二叉树的节点 struct BinTreeNode { DataType info ; PBinTreeNode llink ;