遍历

非标准树状结构数据的处理

那年仲夏 提交于 2020-02-17 17:44:34
之前笔者写过两篇博客来讲如何处理标准的树状结构数据,分别是 js遍历树形结构方法 和 过滤树形结构数据并获取新的树形结构 。这次就来聊一下如何处理非标准树状结构数据。标准的树状结构数据的下级节点存放的字段是统一的比如说我们常见的children,有一些特别的数据为了语义上更加明确,所以每一级的子级所在的字段都不一样,比如存放省市区标识的数据用cityList存放下级市,areaList存放下级的区。下面来讲一下,如何遍历这种非标准树形结构,并且如何将他们转换成标准的树状结构数据。 先来看一下我们要处理的数据结构,因为内容较多这里就只放出部分截图: 处理树状结构的方法用递归是最适合不过了。这里也顺带讲一下为什么我们不用循环嵌套的方式去遍历树形结构比如每一级的循环都用for,或者是forEach等等。主要的原因是后期难以维护和扩展,比如树状结构再新增一级,要是用for, map, forEach 等遍历,那你就得再写上一层。层级结构会越来越深,而且每一层相关的判断逻辑可能都需要重新复制一遍。如果用递归,那么他的逻辑结构是很稳定的,如果仅仅是新增了一级,递归的逻辑是仍然有效的,代码无需变动。如果需要修改判断逻辑,基本上只要在递归的主逻辑上稍微修改一下就行,数据的封装和向下传递是基本不需要动的。 处理树状结构数据考验的就是递归的功力。递归主要搞清楚两点,第一点是进入下一次递归的条件

马踏棋盘之递归实现

核能气质少年 提交于 2020-02-17 07:58:52
问题描述: 所谓“马踏棋盘”问题,就是指在中国象棋的棋盘上,用马的走法走遍整个棋盘,在8*8的方格中,每个格都要遍历,且只能遍历一次。 我们把棋盘抽象成一个二维数据,输入起始位置的坐标(x,y),根据马的“日”字走法,将马走的步数写入二维数组,然后输出。下面是一种走法: 解决方法: 我们从图中可以看到,一个位置的马可以有八个不同方向的下一步。如何表示下一步呢? 设当前马的坐标为(x,y),则下一步为(x-2,y+1)、(x-1,y+2)、(x+1,y+2)、(x+2,y+1)、(x+2,y-1)、(x+1,y-2)、(x-1,y-2)、(x-2,y-1)八个方向。 我们设两个全局数组fx[8]={1,2,2,1,-1,-2,-2,-1},fy[8]={2,1,-1,-2,-2,-1,1,2},则上面的八个方向的点 可以表示为: (x+fx[i],y+fy[i]),i为0~7。 我们先设一个数组a[8][8]来存放马的遍历路径。 首先输入一个起始坐标,然后从起始点开始进行深度优先搜索。从第1步找第2步的坐标,然后从第2步找第3步,再从第3步找第4步……。直到找到第64步也就完成任务了。 当然,每一个马都有八个下一步的选择,我们在满足要求的点中任意找一个进行遍历,当八个点都不满足要求时,就回溯的上一步,找其他点进行遍历。 下一步需要满足的条件:点(x,y)要在棋盘上,即0<x,y<8

07_构建二叉树

僤鯓⒐⒋嵵緔 提交于 2020-02-17 06:24:07
构建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 限制: 0 <= 节点个数 <= 5000 解法: 采用递归的形式,对从中序遍历中找父节点,然后根据父节点在前序遍历中找到左子树和右子树的结点。 遇到的问题: 在创建结点的时候对结构体指针的初始化问题没有弄明白( 声明一个结构体指针记得初始化,一定要初始化,不初始化会出事 ) 在获取父节点在中序遍历中的位置后,不能直接用来指定先序遍历中结点的位置,要借助length来计算。 TreeNode* root = new TreeNode(rootValue); root->value = 3; 不能在没有初始换的情况下使用(错误): TreeNode* root; root->value = 3; Solution: /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val

什么是DOM,DOM level 1\\2\\3 的区别是什么

一世执手 提交于 2020-02-17 06:13:35
DOM 文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口。Document Object Model的历史可以追溯至1990年代后期微软与Netscape的“浏览器大战”,双方为了在JavaScript与JScript一决生死,于是大规模的赋予浏览器强大的功能。微软在网页技术上加入了不少专属事物,计有VBScript、ActiveX、以及微软自家的DHTML格式等,使不少网页使用非微软平台及浏览器无法正常显示。DOM即是当时蕴酿出来的杰作。 根据W3C DOM规范,DOM是HTML与XML的应用编程接口(API),DOM将整个页面映射为一个由层次节点组成的文件。有1级、2级、3级共3个级别。 1级DOM 1级DOM在1998年10月份成为W3C的提议,由DOM核心与DOM HTML两个模块组成。DOM核心能映射以XML为基础的文档结构,允许获取和操作文档的任意部分。DOM HTML通过添加HTML专用的对象与函数对DOM核心进行了扩展。 2级DOM 鉴于1级DOM仅以映射文档结构为目标,DOM 2级面向更为宽广。通过对原有DOM的扩展,2级DOM通过对象接口增加了对鼠标和用户界面事件(DHTML长期支持鼠标与用户界面事件)、范围、遍历(重复执行DOM文档)和层叠样式表(CSS)的支持。同时也对DOM

什么是DOM,DOM level 1\\2\\3 的区别是什么

元气小坏坏 提交于 2020-02-17 06:11:14
什么是DOM,DOM level 1\2\3 的区别是什么: https://www.cnblogs.com/PopularProdigal/p/6506003.html DOM 文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口。Document Object Model的历史可以追溯至1990年代后期微软与Netscape的“浏览器大战”,双方为了在JavaScript与JScript一决生死,于是大规模的赋予浏览器强大的功能。微软在网页技术上加入了不少专属事物,计有VBScript、ActiveX、以及微软自家的DHTML格式等,使不少网页使用非微软平台及浏览器无法正常显示。DOM即是当时蕴酿出来的杰作。 根据W3C DOM规范,DOM是HTML与XML的应用编程接口(API),DOM将整个页面映射为一个由层次节点组成的文件。有1级、2级、3级共3个级别。 1级DOM 1级DOM在1998年10月份成为W3C的提议,由DOM核心与DOM HTML两个模块组成。DOM核心能映射以XML为基础的文档结构,允许获取和操作文档的任意部分。DOM HTML通过添加HTML专用的对象与函数对DOM核心进行了扩展。 2级DOM 鉴于1级DOM仅以映射文档结构为目标,DOM 2级面向更为宽广。通过对原有DOM的扩展

使用JQuery操作DOM

落爺英雄遲暮 提交于 2020-02-17 06:07:46
1.DOM操作 DOM操作分为三类: DOM Core:任何一种支持DOM的编程语言都可以使用它,如getElementById() HTML-DOM:用于处理HTML文档,如document.forms CSS-DOM:用于操作CSS,如element.style.color="green" 提示:JavaScript用于对(x)html文档进行操作,它对这三类DOM操作都提供了支持 2.jQuery中的DOM操作 jQuery对JavaScript中的DOM操作进行了封装 样式操作 内容及Value值操作 节点操作 节点属性操作 节点遍历 CSS-DOM操作 使用jquery操作样式 jquery.css("background","red"); jquery.css({"background":"red","font-size":"25px"}); 追加样式 $(selector).addClass(class); 或 $(selector).addClass(class1 class2 … classN); 移除样式 $(selector).removeClass("class") ; 或 $(selector).removeClass("class1 class2 … classN ") ; 3.html( ) 和text( )方法的区别 4.表单元素 一种:

1219:马走日

纵然是瞬间 提交于 2020-02-17 05:37:08
1219:马走日 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 马在中国象棋以日字形规则移动。 请编写一段程序,给定n×m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。 【输入】 第一行为整数T(T < 10),表示测试数据组数。 每一组测试数据包含一行,为四个整数,分别为棋盘的大小以及初始位置坐标n,m,x,y。(0≤x≤n-1,0≤y≤m-1, m < 10, n < 10)。 【输出】 每组测试数据包含一行,为一个整数,表示马能遍历棋盘的途径总数,0为无法遍历一次。 【输入样例】 1 5 4 0 0 【输出样例】 32 【来源】 No #include<iostream> #include<cstdio> #include<cstring> using namespace std; int sum; int x[8]={1,2,2,1,-1,-2,-2,-1}; int y[8]={-2,-1,1,2,2,1,-1,-2}; int ss[101][101]={0}; int t,m,n,a,b,c; int xx,yy; void dfs(int a,int b,int c) { if(c==m*n) sum++; else { for(int i=0;i<8;i++){ xx=a

Java-Array01

放肆的年华 提交于 2020-02-16 21:30:20
Array class ArrayDemo { public static void main(String[] args) { /* 数组的定义方式: 元素类型[] 数组名 = new 元素类型[元素个数或数组长度]; 好处:数组可以存储多个数据,而且可以对数据进行编号, 从0开始。操作元素完成可以通过编号(索引)完成。 */ int[] arr = new int[3];//通过new关键字创建了一个长度为3,元素类型是int的数组实体。 System.out.println(arr[1]); //System.out.println(arr[3]);//ArrayIndexOutOfBoundsException:访问到了数组不存在的索引时,会发生该异常。 arr = null; System.out.println(arr[0]);//NullPointerException:当使用没有任何实体指向的引用变量操作实体时,运行会发生该异常。 /* Java对内存空间的划分:五部分: 栈,堆,方法区,本地方法区,寄存器。 栈内存:存储都是局部变量。只要是在方法中定义的变量都是具备变量。 一旦变量的生命周期结束该变量就被释放。 堆内存:存储都是实体(对象) 每一个实体都有一个首地址值。 堆内存的变量都有默认初始化值。不同类型不一样。int-0 double-0.0 boolean

leetcode题目 130. 被围绕的区域

∥☆過路亽.° 提交于 2020-02-16 14:29:59
题目 给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。 找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。 示例 输入: X X X X X O O X X X O X X O X X 运行你的函数后,矩阵变为: X X X X X X X X X X X X X O X X 解释: 被围绕的区间不会存在于边界上,换句话说,任何边界上的 ‘O’ 都不会被填充为 ‘X’。 任何不在边界上,或不与边界上的 ‘O’ 相连的 ‘O’ 最终都会被填充为 ‘X’。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的 思路 我们要把被X包围的O变为X,只需要找到与边界相连的O即可,这些O是不需要被改变的。所以我们遍历二维数组的上下左右边界,判断当前元素是否是O,如果是O则进入dfs深度优先遍历,把与此O相连的所有O置为V(此字母可任定,只要不是X与O即可),如果不是,继续遍历即可。当所有遍历完成后,所有与边界相连的O都变为了V,所以剩余的O则是我们需要变为X的O,循环改变即可,最后再把V变回O。 代码 public class problem130 { static int [ ] [ ] pos = { { 1 , 0 } , { 0 , 1 } , { - 1 , 0 } , { 0 , - 1 } } ; public void solve (

Java遍历List Set Map的方法

那年仲夏 提交于 2020-02-16 12:14:05
遍历List的方法 //普通for循环 for ( int i = 0 ; i < list . size ( ) ; i ++ ) { String temp = ( String ) list . get ( i ) ; System . out . println ( temp ) ; } //增强for循环 for ( String temp : list ) { System . out . println ( temp ) ; } //使用Iterator(0) for ( Iterator iter = list . iterator ( ) ; iter . hasNext ( ) ; ) { String temp = ( String ) iter . next ( ) ; System . out . println ( temp ) ; } //使用Iterator(1) Iterator iter = list . Iterator ( ) ; while ( iter . hasNext ( ) ) { Object obj = iter . next ( ) ; iter . remove ( ) ; System . out . println ( obj ) ; } 遍历Set的方法 //增强for循环 for ( String temp :