遍历

二叉树的前中后序遍历

ⅰ亾dé卋堺 提交于 2019-12-02 11:16:47
二叉树的前中后遍历,其前中后,您可理解为指的是根结点所在的序。 前序遍历:前序遍历的顺序为根-左-右 中序遍历:中序遍历的顺序为左-根-右 后序遍历:后序遍历的顺序为左-右-根 1.前序遍历 思路:利用栈后进先出的特性。 1.根结点入栈; 2.循环取栈顶元素、右子结点入栈、左子结点入栈。 JAVA参考代码 public class TreeNode { int val ; TreeNode left ; TreeNode right ; ​ TreeNode ( int val ) { this . val = val ; } } public List < Integer > preorderTree ( TreeNode root ) { Stack < TreeNode > stack = new Stack < > ( ) ; List < Integer > preorder = new ArrayList < > ( ) ; ​ if ( root == null ) { return preorder ; } ​ stack . push ( root ) ; while ( ! stack . empty ( ) ) { TreeNode node = stack . pop ( ) ; preorder . add ( node . val ) ; if (

二叉树的层序遍历

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-02 11:16:22
二叉树的层序遍历,分为自上而下和自下而上进行层序遍历。 自上而下:从根结点层往下逐层从左往右访问。 自下而上:从叶子结点层往上逐层从左往右访问。 1.自上而下层序遍历 思路:利用队列先进先出的特性。 1.创建Queue,根节点入队; 2.队列不为空,记录此时的队列长度(即该层的元素个数); 3.按以上长度循环遍历队列,取队列元素,将结果存到一个一维向量,然后入队其左右两个子节点。将结果添加到二维向量,重复步骤2。 JAVA参考代码 public List < List < Integer > > levelOrderFromTop ( TreeNode root ) { List < List < Integer > > result = new ArrayList ( ) ; if ( root == null ) { return result ; } Queue < TreeNode > queue = new LinkedList < > ( ) ; queue . offer ( root ) ; while ( ! queue . isEmpty ( ) ) { List < Integer > level = new ArrayList < > ( ) ; int size = queue . size ( ) ; for ( int i = 0 ; i < size

合并俩个有序链表

谁说我不能喝 提交于 2019-12-02 11:10:36
题目: 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 解题思路: 1.new一个结果链表用来存放合并之后的结点。 2.同时遍历俩个链表,比较他们的值,值较小的尾插至结果链表。 3.当一个链表遍历结束,而另一个还没有遍历结束,就把另一个链表剩下的结点尾插到结果链表中。 public Node mergeTwoLists ( Node l , Node h ) { Node newHead = null ; Node last = null ; Node cur1 = l ; Node cur2 = h ; while ( cur1 != null && cur2 != null ) { if ( cur1 . val <= cur2 . val ) { //尾插 Node next = cur1 . next ; if ( newHead == null ) { newHead = cur1 ; } else { last . next = cur1 ; } last = cur1 ; cur1 = next ; } else { Node next = cur2 . next ; if ( newHead == null ) { newHead = cur2 ; } else { last . next = cur2 ; } last

前端的必备数组操作

↘锁芯ラ 提交于 2019-12-02 11:04:42
前端的必备数组操作 作为一个前端,往往会与数据处理打交道,今天分享一下前端必备的数组知识 1.数组的定义 arr= [], var arr = new Array(); 2.数组常用的方法: push:末尾添加 unshift:前面添加 pop:删除末元素 shift:头部删除 splice:删除数组中的任意元素,一般利用下标去执行删除 slice:复制数组, concat:链接两个数组,返回这个新数组 就是一个数组合并方法 join:把数组中的每一项 按照指定的分隔符拼接成字符串 reverse:倒序数组,返回值到倒序数组 sort:根据匿名函数进行冒泡排序 indexOf :返回获取项在数组中的索引 不在是-1 lastIndexOf:返回获取项在数组中最后一次出现的最后索引 forEach:循环遍历数组: 参数是一个匿名函数 map:循环遍历数组,参数是一个匿名函数 最后:大家一定要注意数组的操作是遍历它的长度去执行的 for(var i=0;i<arr.length;i++){   if(arr[i]==3){   console.log(arr[i]) } } 这里我们会想起轮播图,原生的js有这样的身影,我们取到的元素对象就是一个集合,我们通过遍历去置空,再确定当前的样式 就是常说的排他思想 再确立自己。 在实际开发中,我们常常会用到数组 和 if ,还有正则表达式

二叉树的层次遍历II

半世苍凉 提交于 2019-12-02 10:53:57
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其自底向上的层次遍历为: [ [15,7], [9,20], [3] ] 由例子可以看出,用队列做比较方便。最终返回的是一个List<List<>>型,中间的List是ArrayList<>型。用队列存储节点,然后将每一层的节点值依次存入ArrayList<>。这里使用了count记录每层节点数。 public List < List < Integer > > levelOrderBottom ( TreeNode root ) { LinkedList < List < Integer > > result = new LinkedList < > ( ) ; if ( root == null ) return result ; Queue < TreeNode > queue = new LinkedList < > ( ) ; queue . add ( root ) ; while ( ! queue . isEmpty ( ) ) { List < Integer > oneLevel = new ArrayList < > ( ) ; //

B树和B+树笔记

感情迁移 提交于 2019-12-02 10:46:23
B树和B+树都属于多叉平衡查找树,使得查询时间复杂度为O(logN)。 B树: 树结点:记录——关键字(数据库中的索引),关键字对应记录的指针,子节点的指针。 关键字:数据库中的索引,每个树结点记录的关键字个数大于1小于树的M。 关键字对应记录的指针:根据该指针数据库可以直接查询到该索引对应的数据库记录。 子节点的指针:根据该指针查询子节点,子节点的关键字大小位于父节点某两个关键字的中间。 B+树: 非叶子树结点:记录——关键字(数据库中的索引),子节点的指针, 不记录关键字对应的数据 。 叶子结点:记录——关键字(数据库中的索引),关键字对应的数据(聚簇索引:该索引对应的记录的指针;非聚簇索引:该索引对应的聚簇索引,并通过回表查询该聚簇索引对应的数据) 关键字:数据库中的索引,每个树结点记录的关键字个数大于1小于树的M。 子节点的指针:根据该指针查询子节点,子节点的关键字大小位于父节点某两个关键字的中间。 B树的优点:B树查询数据时,如果查询的数据离根节点很近,且树结点中记录了对应记录的指针,因此可以较为快速的获取该条数据,不用遍历到叶子结点。 B+树的优点:1.非叶子结点不记录索引对应的记录的指针,因此可以用更多空间用于存放索引记录,降低了树的高度,可以快速的进行查询。        2.所有关键字的数据都记录在叶子结点,因此查询速度稳定(都需要遍历到叶子)。 3

DFS 算法模板

流过昼夜 提交于 2019-12-02 10:42:44
DFS总结: 1、第一次讲的dfs模板一定要记住。 2、二叉树的遍历,https://www.cnblogs.com/rnanprince/p/11595380.html,先序中序的递归和迭代写法必须掌握,像算法模板一样记住。后序遍历只掌握递归写法。 3、遍历过程中需要记住上次遍历节点才能得到结果的,记住模板。 last_node = None def dfs (root): if last_node is None: last_node = root else: compare(last_node, root).... last_node = root dfs(root.left) dfs(root.right) 4、BST的搜索代码要会,要记住。 5、排列组合类题目: 组合类算法,都使用分治+递归的思路去写,重复元素,先排序,无非多了一个判断。 排列类算法,用交换思路,都使用分治+递归的思路去写,重复元素,无非多了一个判断。 6、隐式图搜索:八皇后,正则表达式匹配,word拼图 i j | | abc ==> abc dfs(i+1, j+1) a*bc ==> aaabc dfs(i+2, j) or dfs(i, j+1) a.bc ==> adbc dfs(i+1, j+1) a b c g a n a x x i x x n x x dfs(左边走) dfs(右边走)

动态规划遍历顺序问题

北城余情 提交于 2019-12-02 10:37:19
首先0-1背包问题 f[i][j]=max( f [ i-1 ] [ j ],f[ i-1 ][ j - t[ i ] ] + v [ i ] ) 压缩至一维以后变成 f[i][j]=max( f[ j ],f[ j - t[ i ] ] + v [ i ] ) 相当于把第一维省略,后面计算的值不断覆盖前面的 如果从前向后遍历的话,假设f[j - t [i] ]的值已近被更新(加上了v[i]),在计算f[ i ][ j ]的时候,又会被更新,就相当于把一种东西加了两次,所以与题意一种物品只能加一次不符合,故要从后往前遍历 完全背包问题 f[i][j]=max( f [ i-1 ] [ j ],f[ i ][ j - n t[ i ] ] +n v [ i ] ) 压缩至一维以后 f[i][j]=max( f[ j ],f[ j - n t[ i ] ] +n v [ i ] ) 注意到第一个i - 1和第二个 i 都被压缩了,但这两个含义不同i - 1的含义是更新之前的,而i 的含义是更新之后的,所以就像上面的一样,因为现在一种物品可以加无限次,所以就从前向后遍历 来源: https://blog.csdn.net/qq_43261254/article/details/102752772

【数据结构】-树及森林 菜单实现 深度优先 广度优先 递归遍历

醉酒当歌 提交于 2019-12-02 08:10:11
前言: 树是一种非常有趣的数据结构,在大学时期有学过,但缺乏实际运用场景,所以学完后来就忘得差不多了...但工作以后才发现,树这种数据结构是那么重要和常见,用得好的话可以让你代码更优雅,性能更佳,为了让树里面的概念更易于理解,关于树的定义这块我尽量通俗,牺牲一些标准性,提高可读性,不至于像读大学课本上对树的定义那样难懂. 1.基本概念 1.1定义 树:是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构。没有结点的树称为空(null或empty)树。一棵非空的树包括一个根结点,还(很可能)有多个附加结点,所有结点构成一个多级分层结构。 说白话:树是由根节点和树枝节点(暂且这么叫..)和叶子节点共同构成的一种数据结构,树节点之间不存在闭环,每棵树有且仅有一个根节点.直接来张图: 1.2常见术语 根:树的顶点,从它开始可以向下找到任意一个节点,但向上找除了它本身没有任何节点,对应上图中的A节点. 叶子节点:没有孩子的节点就是叶子节点了,对应图中的KLM. 其它非根非叶子节点我一般叫它普通节点,当然不必纠结这些,只要知道根和叶子即可... 森林:多棵树组合在一起就是一个森林,当然如果树的高度>1,把这棵树的根去掉,其它节点所组成的就是一个森林. 森林如下图所示: 高度/深度:树中结点的最大层次 2.树的建立 直接上代码吧,为了代码简洁易懂,暂不考虑NPE: 树节点对象

数组基本概述

只愿长相守 提交于 2019-12-02 06:40:46
1. 数组基本概述 01. 什么是数组? 数组其实也算是变量,传统的变量只能存储一个值,但数组可以存储多个值。 02. 数组的分类 Shell数组分为普通数组和关联数组。 普通数组:只能使用整数作为数组索引。 关联数组:可以使用字符串作为数组索引。 2. 数组基本使用 01. 普通数组仅能使用整数来作为索引 #普通数组赋值方式 #1.方式一:针对每个索引进行赋值 [root@qiudao ~]# array1[0]=pear [root@qiudao ~]# array1[1]=apple [root@qiudao ~]# array1[2]=orange [root@qiudao ~]# array1[3]=peach 2.方式二:一次赋多个值,数组名=(多个变量值) [root@qiudao ~]# array2=(tom jack alice) [root@qiudao ~]# array3=(tom jack alice "bash shell") [root@qiudao ~]# array4=(1 2 3 "linux shell" [20]=puppet) #3.方式三:将该文件中的每一个列作为一个元数赋值给数组array5,默认以空格为分割符 [root@qiudao ~]# array5=(`cat /etc/passwd`) 02.