遍历

二叉树的非递归遍历与层次遍历

孤人 提交于 2020-03-01 13:50:44
二叉树的递归遍历很好写,也很好理解。但因为是递归程序,不可避免地需要调用系统栈,耗时较长,这里我们来探究一下二叉树的非递归遍历的算法。这种方法需要使用栈这种数据结构,这里关于栈的一些操作函数可以看成伪代码吧,先给出线序、中序、后序遍历的代码即说明。 先序遍历: 1 void PreOrderTraverse(BinTree b) 2 { 3 InitStack(S);///初始化创建栈 4 BinTree p=b;///p为工作指针 5 while(p||!isEmpty(s)) 6 { 7 while(p)///到最左下的孩子 8 { 9 printf(" %c ",p->date);///先序先遍历结点 10 Push(S,p);///入栈 11 p=p->lchild; 12 } 13 if(!isEmpty(s))///在栈不为空的情况下,左孩子为空,弹出该结点,遍历右孩子 14 { 15 p=Pop(s); 16 p=p->rchild; 17 } 18 } 19 } 再给出使用数组模拟的函数 1 void Preorder_n(BiTree bt) /*先序遍历的非递归算法*/ 2 { 3 BiTree stack[MAX],p; 4 int top=0,i; 5 for(i=0; i<MAX; i++) 6 { 7 stack[i]=NULL; /*初始化栈*/ 8

多维数组的遍历性能

做~自己de王妃 提交于 2020-03-01 13:12:03
数组是Java中的一种容器对象,它拥有多个单一类型的值。当数组被创建的时候数组长度就已经确定了。在创建之后,其长度是固定的。下面是一个长度为10的数组: public class ArrayDemo { private int arraySize=10; public int[] arrayOfIntegers = new int[arraySize]; } 上面的代码是一维数组的例子。换句话说,数组长度只能在一个方向上增长。很多时候我们需要数组在多个维度上增长。这种数组我们称之为多维数组。为简单起见,我们将它称为2维数组。当我们需要一个矩阵或者X-Y坐标系的时候,二维数组是非常有用的。下面就是一个二维数组的例子: public class TheProblemOf2DArray { private static final int ARR_SIZE=10; public static void main(String[] args) { int arr[][]=new int[ARR_SIZE][ARR_SIZE]; } } 想象一下,一个二维数组看起来就像一个X-Y坐标系的矩阵。 然而,可能让Java开发者们感到惊讶的是,Java实际上并没有二维数组。 在一个真正的数组中,所有的元素在内存中都存放在连续的内存块中,但是在Java的二维数组并不是这样

Java linkedList详细介绍及使用示例

孤人 提交于 2020-03-01 12:09:09
①LinkedList简单介绍 是一个继承于AbstractSequentialList的双向链表。它可以被当成堆栈、队列或双端队列进行操作。 实现了List接口,能对它进行队列操作。 实现了Deque接口,能当作双端队列使用。 实现了Cloneable接口,覆盖了clone(),能克隆。 实现了java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。 是非同步的 ②LinkedList构造函数 // 默认构造函数 LinkedList() // 创建一个LinkedList,保护Collection中的全部元素。 LinkedList(Collection<? extends E> collection) ③AbstractSequentialList简介 介绍一下AbstractSequentialList。毕竟,LinkedList是AbstractSequentialList的子类。 1)AbstractSequentialList 实现了get(int index)、set(int index, E element)、add(int index, E element) 和 remove(int index)这些函数。这些接口都是随机访问List的,LinkedList是双向链表

pta题解

喜夏-厌秋 提交于 2020-03-01 12:04:14
pta题解 习题2.4 递增的整数序列链表的插入 (15分) 这道题先申请一个空间然后把数据存进去,然后从头开始遍历,如果比当前遍历到的小,那么就插在它的前面。通过q,和l两个指针,l一直往下遍历,然后更新q,这样会比较容易插入,要注意考虑,可能会一直遍历到最尾部才满足条件 List Insert ( List L , ElementType X ) { List head = L ; L = L -> Next ; List p = ( List ) malloc ( sizeof ( struct Node ) ) ; p -> Data = X ; p -> Next = NULL ; List q = head ; while ( L -> Data < X ) //循环遍历 { q = L ; //更新q L = L -> Next ; //l指针往后移动 if ( L -> Next == NULL ) { L -> Next = p ; return head ; } } p -> Next = L ; q -> Next = p ; return head ; } 习题2.5 两个有序链表序列的合并 (15分) 这道题本来我没有思路,以为要新建一个链表,后来看了别人的题解才有了思路,这道题就是建立一个头结点,然后比较两个链表,小的就插进去,然后向后移,然后继续比较

剑指offer刷题34、35—二叉树中和为某一值的路径、复杂链表的复制

安稳与你 提交于 2020-03-01 11:52:45
34 二叉树中和为某一值的路径 题目 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 思路 深度优先搜索。使用前序遍历,使用两个全局变量result和tmp,result来存放最终结果,tmp用来存放临时结果。 每次遍历,我们先把root的值压入tmp,然后判断当前root是否同时满足: 与给定数值相减为0; 左子树为空; 右子树为空。 如果满足条件,就将tmp压入result中,否则,依次遍历左右子树。需要注意的是,遍历左右子树的时候,全局变量tmp是不清空的,直到到了根结点才请空tmp。 代码: /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public : vector < vector < int > > FindPath ( TreeNode * root , int expectNumber ) { if ( root == NULL ) { return result ; } tmp . push_back ( root

CopyOnWriteArrayList 简介

為{幸葍}努か 提交于 2020-03-01 04:16:02
除了加锁外,其实还有一种方式可以防止并发修改异常,这就是将读写分离技术(不是数据库上的)。 先回顾一下一个常识: 1、JAVA中“=”操作只是将引用和某个对象关联,假如同时有一个线程将引用指向另外一个对象,一个线程获取这个引用指向的对象,那么他们之间不会发生 ConcurrentModificationException,他们是在虚拟机层面阻塞的,而且速度非常快,几乎不需要CPU时间。 2、JAVA中两个不同的引用指向同一个对象,当第一个引用指向另外一个对象时,第二个引用还将保持原来的对象。 基于上面这个常识,我们再来探讨下面这个问题: 在CopyOnWriteArrayList里处理写操作(包括add、remove、set等)是先将原始的数据通过JDK1.6的Arrays.copyof()来生成一份新的数组 然后在新的数据对象上进行写,写完后再将原来的引用指向到当前这个数据对象(这里应用了常识1),这样保证了每次写都是在新的对象上(因为要保证写的一致性,这里要对各种写操作要加一把锁,JDK1.6在这里用了重入锁), 然后读的时候就是在引用的当前对象上进行读(包括get,iterator等),不存在加锁和阻塞,针对iterator使用了一个叫 COWIterator的阉割版迭代器,因为不支持写操作,当获取CopyOnWriteArrayList的迭代器时

citrix 路径遍历 rce漏洞(CVE-2019-19781)

别来无恙 提交于 2020-03-01 02:54:12
漏洞描述 Citrix旗下多款交付控制器和网关存在RCE漏洞,攻击者在无需身份验证的情况下就可执行任意命令。根据其他安全网站的说法,这个RCE漏洞会有一个标记漏洞(其中之一的标记),即本次报道的Citrx路径遍历漏洞(CVE-2019-19781)。Citrx路径遍历漏洞(CVE-2019-19781)利用方式的PoC已被公开。该漏洞利用复杂性低,且无权限要求,攻击者只能遍历vpns文件夹,但攻击者可能利用Citrx路径遍历漏洞进行RCE漏洞试探,从而发起进一步精准攻击。 影响范围 Citrix NetScaler ADC and NetScaler Gateway version 10.5,Citrix ADC and NetScaler Gateway version 11.1 , 12.0 , 12.1 ,Citrix ADC and Citrix Gateway version 13.0 漏洞检测方法 根据此次公开的PoC显示,该洞目录遍历被限制子在vpns文件夹下,任意用户可通过HTTP请求直接访问该目录下的文件。 https://xx.xx.xx.xx/vpn/../vpns/services.html https://xx.xx.xx.xx/vpn/../vpns/smb.conf 如果没有修复的话的会返回 http 200 通过fofa搜索 title=

Python 遍历

假装没事ソ 提交于 2020-03-01 02:33:50
python 遍历 Sequence l = [ 1 , 2 , 3 , 4 , 5 ] for i in l : print ( i ) #Showing:1 2 3 4 5 for i in range ( len ( l ) ) : print ( 'idx: %d, val: %d' % ( i , l [ i ] ) ) Dictionary d = { '1' : 1 , '2' : 2 , '3' : 3 } for k in d . keys ( ) : print ( d [ i ] ) for v in d . values ( ) : print ( i ) for k , v in d . items ( ) : print ( k , v ) Advanced method l = [ 1 , 2 , 3 , 4 , 5 ] for idx , val in enumerate ( l ) : print ( idx , val ) l_name = [ '一' , '二' , '三' ] l_val = [ 1 , 2 , 3 ] for name , val in zip ( l_name , l_val ) : print ( name , val ) 来源: CSDN 作者: 全能技术进阶之路 链接: https://blog.csdn.net

小白的自我救赎:字符串和常用数据结构学习

a 夏天 提交于 2020-02-29 16:42:12
字符串: 字符串首字母大写 capitalize() 每个单词首字母大写 title() 字符串整体大写 upper() 字符串整体小写 lower() 查找位置: find(),index(),返回所查找的字符在字符串中的位置,如果使用index()进行查找,在没找到的时候会引发异常 去掉字符串两侧的空格 strip() 列表: 遍历列表可以用下标遍历也可以直接遍历 通过enumerate函数处理列表之后再遍历可以同时获得元素索引和值 for index , elem in enumerate ( list1 ) : print ( index , elem ) 删除列表中已知值 remove() 删除指定位置的元素 pop() 列表排序: sorted() 按首字母在字母表中的顺序排序 sorted(list,key=len) 通过key关键字参数指定根据字符串长度进行排序而不是默认的字母表顺序 用列表的生成式语法来创建列表: f = [ x for x in range ( 1 , 10 ) ] print ( f ) f = [ x + y for x in 'ABCDE' for y in '1234567' ] print ( f ) # 用列表的生成表达式语法创建列表容器 # 用这种语法创建列表之后元素已经准备就绪所以需要耗费较多的内存空间 f = [ x ** 2

Python os模块介绍

倾然丶 夕夏残阳落幕 提交于 2020-02-28 21:54:37
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd os.curdir 返回当前目录: ('.') ? 1 os.pardir 获取当前目录的父目录字符串名:('..') os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 os.remove() 删除一个文件 os.rename("oldname","newname") 重命名文件/目录 os.stat('path/filename') 获取文件/目录信息 os.symlink('path/filename','ln_filename') 创建符号链接,源需绝对路径 os.utime() 修改时间属性 >>> import os