遍历

Python数据结构和算法(五)------树与树算法

岁酱吖の 提交于 2019-12-02 12:44:33
树与树算法 目录 树与树算法 一、关于树的一些概念 1.树的定义 2.树的术语 3.树的分类 4.树的存储与表示 二、二叉树 1.基本概念 2.基本性质 3.二叉树的存储 4.二叉树的节点创建和广度遍历 5.二叉树的深度遍历 6.由遍历结果确定一棵二叉树 一、关于树的一些概念 1.树的定义 树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 每个节点有零个或多个子节点; 没有父节点的节点称为根节点; 每一个非根节点有且只有一个父节点; 除了根节点外,每个子节点可以分为多个不相交的子树; 2.树的术语 节点的度 :一个节点含有的子树的个数称为该节点的度; 树的度 :一棵树中,最大的节点的度称为树的度; 叶节点或终端节点 :度为零的节点; 父亲节点或父节点 :若一个节点含有子节点,则这个节点称为其子节点的父节点; 孩子节点或子节点 :一个节点含有的子树的根节点称为该节点的子节点; 兄弟节点 :具有相同父节点的节点互称为兄弟节点; 节点的层次 :从根开始定义起,根为第1层,根的子节点为第2层,以此类推; 树的高度或深度 :树中节点的最大层次; 堂兄弟节点

ACM算法笔记

▼魔方 西西 提交于 2019-12-02 12:32:18
HNU君陌 此笔记为本人在准备ACM校赛时阅读资料所整理的总结心得,适合入门级的同学,仅供参考: 第一部分语言 第一章程序设计入门 1.1算术表达式 整数型用printf()时为%d,实数用%f输出,保留一位n数为printf(“%.nf”, ) 1.2变量及其输入 整数型用scanf()时为%d,实数用%lf输入,%5d表示按5位数打印,%05d表示按5位数表示,不足补0。 占位符和变量的数据类型一一对应,且每个变量前均需要加”&”符号。 竞赛时,选手程序的执行是自动完成的,没有人工干预,不需要界面友好。也不要让程序按任意键退出:system(“pause”)或添加一个多余的getchar() 不要在竞赛中使用getch()、getche()、gotoxy()、clracr()函数 在算法竞赛中,每行输出均应以回车符结束,包括最后一行,除非特别说明,每行的行首不应有空格,但行末可以有多余空格。另外,输出的每两个数或者字符串之间应以单个空格隔开。即算法竞赛的程序制作三件事:读入数据,计算结果,打印输出 1.3变量交换 三变量法: t=a; a=b; b=t; 单变量法(只有定义了加减法的数据类型才可以): a=a+b; b=a-b; a=a-b; 1.4分支结构程序设计 第二章循环结构设计 2.1 for循环 尽量缩短变量的定义范围。 浮点运算可能存在误差,在进行浮点数比较的时候

JavaSE_09_Map

ぐ巨炮叔叔 提交于 2019-12-02 12:24:07
1.1 概述 Collection 中的集合,元素是孤立存在的,向集合中存储元素采用一个个元素的方式存储。 Map 中的集合,元素是成对存在的(Key---Value)。每个元素由键与值两部分组成,通过键可以找对所对应的值。 Collection 中的集合称为单列集合, Map 中的集合称为双列集合。 需要注意的是, Map 中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。 1.2 Map常用子类 HashMap<K,V> :存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。 LinkedHashMap<K,V> :HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。 1.3 Map接口中的常用方法 public V put(K key, V value) : 把指定的键与指定的值添加到Map集合中。(如果map中已经存在这个元素,则覆盖他的值,并返回覆盖的值) public V remove(Object key) : 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。

顺序存储二叉树的基本原理和实现(Java)

末鹿安然 提交于 2019-12-02 12:09:28
顺序存储二叉树的概念: 基本说明: 从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组,看下面的示意图。 要求: 右图的二叉树的结点,要求以数组的方式来存放 arr : [1, 2, 3, 4, 5, 6, 6] 要求在遍历数组 arr时,仍然可以以前序遍历,中序遍历和后序遍历的方式完成结点的遍历 顺序存储二叉树的特点: 1、顺序二叉树通常只考虑完全二叉树 2、第n个元素的左子节点为 2 * n + 1 3、第n个元素的右子节点为 2 * n + 2 4、第n个元素的父节点为 (n-1) / 2 (n : 表示二叉树中的第几个元素(按0开始编号如上图所示)) 代码实现: package Tree ; /** * @ClassName: ArrBinaryTreeDemo * @Description: 顺序存储二叉树的前序遍历 * @author Golven * @date 2019年10月26日 * */ public class ArrBinaryTreeDemo { public static void main ( String [ ] args ) { int [ ] arr = { 1 , 2 , 3 , 4 , 5 , 6 , 7 } ; ArrBinaryTree arrBinaryTree = new

Java集合类迭代器

血红的双手。 提交于 2019-12-02 12:05:53
迭代器 概念 迭代器是一种设计模式,提供了一种方法,来对容器、集合进行遍历的方式, 不需要关注底层数据结构和数据类型,来达到底层和上层遍历解耦的目的 方法 boolean hashNext() 判断集合是否还有元素 true / false E next() 返回当前数据 void remove() 删除元素 注意 在使用迭代器时,hasNext,next需要交替出现 要自定义迭代器类需要实现iterable接口 自定义迭代器类需要实现Iterator接口 具体实现步骤: 自定义实现迭代器 并发异常问题:ConcurrentModificationException 集合本身修改会引起modCount版本号修改。而迭代器的版本号副本并未改变,因此会引起ConcurrentModificationException异常 public static void main ( String [ ] args ) { ArrayList < Integer > arrayList = new ArrayList < > ( ) ; arrayList . add ( 2 ) ; arrayList . add ( 3 ) ; arrayList . add ( 8 ) ; arrayList . add ( 5 ) ; Iterator < Integer > iterator =

容器、迭代器和算法

不想你离开。 提交于 2019-12-02 12:01:08
文章目录 容器、迭代器和算法 容器的实现 Java的实现方法 C++的实现方法 容器与迭代器 链表容器与迭代器 集合与迭代器 迭代器与算法 求容器中元素纸盒 微型算法库 容器和迭代器的分类 容器的陷阱 这是《深入实践C++模板编程》第五章“容器、迭代器和算法”的读书笔记。 容器、迭代器和算法 通过C++模板可以将类型以及其他编译期常数作为参数抽离出来,使代码拜托对类型依赖,从而设计容纳不同类型的容器成为可能。 容器 是指专门用于存储某种形式组织及存储的类。 容器的实现 常见的容器有数组、链表、集合、关联组等。通常语言本身会提供几种基本容器,通过这些基本容器可以组织更复杂的容器。这些容器的共同点是 可以容纳多种类型的数据 。 弱类型的动态语言,对于数据类型不敏感,其提供的类型天然支持多种数据类型。例如Python中的 list , dict , set 等,可以在同一个容器实例中保存不同类型的数据,实现异质容器。 强类型语言,变量以及函数惨了类型固定变,这是设计支持多种数据类型容器的最大障碍。C++通过模板,使得容器和算法结构不再依赖具体类型;但是这并没有实现真正支持多种类型的容器类。支持不同类型,只是生成了不同类型的容器类。 除了C++模板,其他强语言类型也有各自容器实现方法。这里介绍Java实现容器方法。 Java的实现方法 与C++相比,Java是更高级的面相对象语言

内部类迭代器

久未见 提交于 2019-12-02 12:00:53
package com.nobody.iterator; /** 基础迭代器接口 * * 迭代器用于遍历一个数据集,且在遍历过程中,可以查看、插入、删除、替换数据元素。 * 迭代器有3种类型:内部迭代器、外部迭代器和内部类迭代器 * * 内部迭代器是将迭代器的操作添加到实现了ADT(线性表等)的类中得到的,因此它可以高效的访问ADT的数据,同一时刻该迭代器对同一个线性表只允许一个迭代。 * * 外部迭代器是一个公有类的对象,该类实现了迭代器方法。这个类独立与实现了ADT的类,但与它相互作用。外部迭代器必须通过ADT的公有方法访问ADT的数据, * 因此,典型的外部迭代器会比其它种类的迭代器花更多的时间来执行操作,另外,外部迭代器允许多个迭代器各自独立遍历同一个ADT的数据。 * * 内部类迭代器是在实现了ADT的类的内部定义的内部类实例。迭代器方法实现在内部类内部,同内部迭代器一样,都可以直接访问ADT的数据,因此也同样高效, * 所付出的代价也一样,但是内部类迭代器和外部迭代器一样,都允许多个迭代器同时遍历访问同一个ADT的数据。 * * */ import java.util.NoSuchElementException; public interface BasicIteratorInterface{ /** Task: 设置迭代器初始位置于向数据集合第一个元素 */

集合学习总结2

≡放荡痞女 提交于 2019-12-02 12:00:26
双列集合的根接口: 1.Map接口概述: 通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同, A:Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储 B:Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。 C:Collection中的集合称为单列集合,Map中的集合称为双列集合。 需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。 2.Map的常用方法: A:映射功能: V put(K key, V value) :以键=值的方式存入Map集合 B:获取功能: V get(Object key):根据键获取值 int size():返回Map中键值对的个数 C:判断功能: boolean containsKey(Object key):判断Map集合中是否包含键为key的键值对 boolean containsValue(Object value):判断Map集合中是否包含值为value键值对 boolean isEmpty():判断Map集合中是否没有任何键值对 D:删除功能: void clear():清空Map集合中所有的键值对 V remove(Object key)

pat顶级1009 Triple Inversions (35 分)

不问归期 提交于 2019-12-02 11:38:45
欢迎访问我的 pat顶级题解目录 哦 题目描述 算法设计 可以利用树状数组来解决这个问题。 由于输入序列的每个元素的值都不会超过 1 0 5 10^5 1 0 5 ,因此我们可以开辟一个长 1 0 5 + 5 10^5+5 1 0 5 + 5 的树状数组 c 。设计getSum(x)函数表示1到x这些数字在序列中出现次数之和。设计update函数用于更新数字出现次数。 我们要对整个序列 A 进行两次遍历,第一次从前向后遍历,针对遍历到的数字 A[i] ,求其左侧比 A[i] 大的数字出现次数之和,并把结果存储到数组 left 中。第二次从后向前遍历,针对遍历到的数字 A[i] ,求其右侧比 A[i] 小的数字出现次数之和,假设为k,计算 A [ i ] ∗ k A[i]*k A [ i ] ∗ k ,即为以 A[i] 为中间的数的 triple inversion 的个数。累加所有这样的 A [ i ] ∗ k A[i]*k A [ i ] ∗ k ,即为最终结果。 C++代码 # include <bits/stdc++.h> using namespace std ; auto lowbit = [ ] ( int x ) { return x & ( - x ) ; } ; vector < int > c ( 100005 ) ; void update ( int x ,

图的遍历

你。 提交于 2019-12-02 11:20:46
给出一个图G和其中任意一个顶点V 0 ,从V 0 出发系统的访问G中所有的顶点,每个顶点访问一次,这叫 图的遍历 。 深度优先搜索(depth-first search)简称DFS 基本思想 访问 一个顶点 V ,然后访问 该顶点邻接 到的 未被访问过的顶点V’ 再从V’出发递归地按照深度优先的方式遍历; 当遇到一个所有邻接于它多的顶点都被访问过了的顶点U时,则回到已访问顶点序列中最后一个未被访问的相邻顶点的顶点W; 在从W出发递归地按照深度优先的方式遍历 最后,当任何已被访问过的顶点都未被访问的相邻顶点时,则遍历结束。 深度优先搜索时间复杂度 对于具有 n个顶点 和 e条边 的无向图或有向图,深度优先搜索算法对图中 每一个顶点至多调用一次DFS 函数 用 邻接矩阵 表示图时,共需检查n 2 个矩阵元素,所需时间为 O(n 2 ) 用 邻接表 表示图时,找邻接点需将邻接表中所有边结点检查一遍,需要时间O(e),对应的深度优先搜索算法时间复杂度为 O(n+e) 。 深度优先搜索(breadth-first search)简称BFS 基本思想 访问顶点V 0 然后访问顶点V 0 邻接到的所有未被访问的顶点V 1 ,V 2 ,…,V i 再依次访问V 1 ,V 2 ,…,V i 邻接道德所有未被访问的顶点 如此进行下去,直到访问遍所有顶点 广度优先搜索时间复杂度 对于具有 n个顶点 和