遍历

数据结构与面向对象程序设计》实验8报告

爱⌒轻易说出口 提交于 2019-12-04 17:42:53
学号 20182329 2019-2020-1 《数据结构与面向对象程序设计》实验8报告 课程:《程序设计与数据结构》 班级: 1823 姓名: 李一卓 学号:20182329 实验教师:王志强 实验日期:2019年10月16日 必修/选修: 必修 1.实验内容 自己根据链的结构,编写一个二叉树。 创建NODE的ATD结构,以及Link的ATD结构以适应树的建立。 学会使用树的先序遍历、中序遍历、后序遍历,来查找、后者是建立树。 学习决策树的的定义和实现方法,可以参照完全二叉树的建立。 实验四也就是用中缀表达式建立一棵树,用后缀表达式输出。 2. 实验过程及结果 参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息 基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树 用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息 自己设计并实现一颗决策树 输入中缀表达式

20182311 2019-2020-1 《数据结构与面向对象程序设计》实验八报告

杀马特。学长 韩版系。学妹 提交于 2019-12-04 15:48:07
20182311 2019-2020-1 《数据结构与面向对象程序设计》实验八报告 课程:《程序设计与数据结构》 班级: 1823 姓名: 冷冲 学号:20182311 实验教师:王志强 实验日期:2019年11月7日 必修/选修: 必修 1.实验内容 参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)。用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图。 基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树。用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息。 自己设计并实现一颗决策树,提交测试代码运行截图,要全屏,包含自己的学号信息 输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,正常评分。如果用到了树,即使有小的问题,也酌情给满分) 2. 实验过程及结果 链树的实现: 基于中序、先序序列构造树: 构造思路:明确不同遍历的特征,确定边界 二叉树前序遍历:先根节点,后左子树,再右子树

ArrayList集合实现RandomAccess接口有何作用?为何LinkedList集合却没实现这接口?

两盒软妹~` 提交于 2019-12-04 15:33:10
众所周知,在List集合中,我们经常会用到ArrayList以及LinkedList集合,但是通过查看源码,就会发现ArrayList实现RandomAccess接口,但是RandomAccess接口里面是空的!Linked并没有实现RandomAccess接口。 这是为什么呢? ----------------------------------------------------------------------------------------------------- 这是ArrayList实现RandomAccess接口的源码 ------------------------------------------------------------------------------------------------------ 这是LinkedList的源码,并没实现RandomAccess接口 ------------------------------------------------------------------------------------------------------ 这是RandomAccess接口的源码 原来RandomAccess接口是一个标志接口(Marker),然而实现这个接口有什么作用呢? 解答:只要List集合实现这个接口

【Java】数组的定义

流过昼夜 提交于 2019-12-04 14:52:14
1.1什么是数组【理解】 数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。 1.2数组定义格式【记忆】 1.2.1第一种 数据类型[] 数组名 示例: int[] arr; double[] arr; char[] arr; 1.2.2第二种 数据类型 数组名[] 示例: int arr[]; double arr[]; char arr[]; 1.3数组动态初始化【应用】 1.3.1什么是动态初始化 数组动态初始化就是只给定数组的长度,由系统给出默认初始化值。 1.3.2动态初始化格式 数据类型[] 数组名 = new 数据类型[数组长度]; int[] arr = new int[3]; 1.3.3动态初始化格式详解 等号左边: int:数组的数据类型 []:代表这是一个数组 arr:代表数组的名称 等号右边: new:为数组开辟内存空间 int:数组的数据类型 []:代表这是一个数组 5:代表数组的长度 1.4数组元素访问【应用】 1.4.1什么是索引 每一个存储到数组的元素,都会自动的拥有一个编号,从0开始。 这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。 1.4.2访问数组元素格式 数组名[索引]; 1.4.3示例代码 public class ArrayDemo { public static void main

集合--Collection与迭代

徘徊边缘 提交于 2019-12-04 14:26:28
1.1Collection 集合 集合:集合是Java提供的一种容器技术,可以用来存储多个数据 集合与数组的区别: 数组的长度是固定的,集合的长度是可变的 数组中存储的是同类型的元素,存储基本数据类型值,集合存储对象, 而且对象的类型可以不一致,在开发中一般当对象多的时候,使用集合进行存储。 1.2集合框架 Java 提供了满足各种API,在使用这些 API 前,首先了解其继承与接口的操作架构, 才能了解何时才有哪个类,以及类之间如何彼此合作,从而灵活运用。 集合按其存储结构可以分为两大类:单列集合 java.util.Collection 和双列集合 java.util.Map Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它由两个重要 的子接口,分别是:java.util.List 和 java.util.Set。其中,List 的特点是:元素有序(会按照 添加的顺序进行元素的输出),而且可以重复(重复指的是内容一致);Set 的特点是: 元素无序(输出时无序),而且元素不可以重复,存放在 java.util 包。 1:List 接口的主要实现类:  java.util.ArrayList java.util.LinkedList  2:Set 接口的主要实现类:  java.util.HashSet  java.util

2019.11.14读书笔记

放肆的年华 提交于 2019-12-04 13:56:54
*** 测试后端组件* 一**:注入操作系统命令 大多数Web服务器平台发展迅速,现在他们已经能够使用内置的API与服务器的操作系统进行几乎任何必需的交互。如正确使用,这些API可帮助开发者访问文件系统,连接其他进程,进行安全的网络通信。但是,许多时候,开发者使用更高级的技术直接向服务器发送操作系统命令。但是,如果应用程序向操作系统传送用户提交的输入,那么就很可能会受到命令注入攻击,由此攻击者能够提交专门设计的输入,修改开发者想要执行的命令。 常用于发出执行系统命令的函数,如php中的exec和ASP中的wscript.shell函数,通常并不限制命令的可执行范围。 eg1: 通过Perl注入 eg2: 通过ASP注入 eg3: 通过动态执行注入 许多Web脚本语言支持动态执行在运行时生成的代码。这种特性允许开发者创建可根据各种数据和条件动态修改其代码的应用程序。 eg4: 查找OS 查找OS命令注入漏洞 0x02 查找动态执行漏洞 动态执行漏洞最常见于PHP,Perl等语言。但基本上,任何应用程序平台都可能会向基于脚本的解释器(有时位于其他后端服务器上)传送用户提交的输入。 防止OS命令注入: 防止OS命令注入漏洞的最佳方法是完全避免直接调用操作系统命令。 几乎所有Web应用程序所需要执行的每个任务都可以使用内置API完成,而且攻击者无法控制这些API,使其执行其他预料之外的命令

遍历图

你。 提交于 2019-12-04 13:42:40
const int N=1e5+10; vector<int> G[N]; void addedge(int u,int v){ G[u].push_back(v); G[v].push_back(u); } int vis[N]; void dfs(int u){ vis[u]=1; for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(vis[v])continue; dfs(v); } } queue<int> Q; void bfs(int s){ vis[s]=1;Q.push(s); while(!Q.empty()){ int u=Q.front();Q.pop(); for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(vis[v])continue; vis[v]=1;Q.push(v); } } }!!!!!注意重边和自环 来源: https://www.cnblogs.com/zyfltyyz/p/11715417.html

二叉树的非递归实现

ぃ、小莉子 提交于 2019-12-04 12:20:32
对二叉树进行先序、中序、后序遍历都是从根结点开始,且在遍历的过程中,经过的节点路线都是一样的,只不过访问的顺序不同。 先序遍历是深入时遇到结点就访问,中序遍历是深入时从左子树返回时遇到结点就访问,而后序遍历是从右子树反回时遇到根结点就访问,在这一过程中,反回结点的顺序与深入结点的顺序相反,即先深入再反回,这不禁让人联想到栈,而想要实现二叉树的非递归遍历,就需要用栈的思想来实现 先序遍历(DLR) 先序遍历的递归过程为 (1)访问根结点 (2)先序遍历根结点的左子树 (3)先序遍历根结点的右子树 而先序遍历的非递归过程为 先将根结点进栈,当栈不为空时,出栈并访问,然后依次将右左结点进栈(栈先进后出,所以先进栈右结点) 如图: void PreOrder(Btnode *b) { Btnode *p; SqStack st; InitStack(st); if (b != NULL) { Push(st, b); //根结点入栈 while (!StackEmpty(st)) { Pop(st, p); //根结点出栈 printf("%c",p->data); //在此处用输出根接地那的值表示出栈 if (p->right != NULL) //当右子树非空 Push(st, p->right); //右孩子入栈 if (p->left != NULL) //当左子树非空 Push