遍历

二叉树遍历(前序、中序、后序、层次遍历、深度优先、广度优先)

有些话、适合烂在心里 提交于 2019-12-03 04:29:14
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有深度遍历和广度遍历,深度遍历有前序、中序以及后序三种遍历方法,广度遍历即我们平常所说的层次遍历。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁,而对于广度遍历来说,需要其他数据结构的支撑,比如堆了。所以,对于一段代码来说,可读性有时候要比代码本身的效率要重要的多。 四种主要的遍历思想为: 前序遍历:根结点 ---> 左子树 ---> 右子树 中序遍历: 左子树 ---> 根结点 ---> 右子树 后序遍历: 左子树 ---> 右子树 ---> 根结点 层次遍历:只需按层次遍历即可 例如,求下面二叉树的各种遍历 前序遍历:1 2 4 5 7 8 3 6 中序遍历:4 2 7 5 8 1 3 6 后序遍历:4 7 8 5 2 6 3 1 层次遍历:1 2 3 4 5 6 7 8 一、前序遍历 1)根据上文提到的遍历思路: 根结点 ---> 左子树 ---> 右子树,很容易写出递归版本: public void preOrderTraverse1(TreeNode root) { if (root != null) { System.out.print(root.val+" "); preOrderTraverse1(root.left);

用python来实现数据结构中的二叉树的广度优先遍历,以及深度优先遍历中的前序遍历、中序遍历,后序遍历。

拈花ヽ惹草 提交于 2019-12-03 04:28:59
二叉树的遍历 树的遍历是树的一种重要的运算。所谓遍历是指对树中所有结点的信息的访问,即依次对树中每个结点访问一次且仅访问一次,我们把这种对所有节点的访问称为遍历(traversal)。那么树的两种重要的遍历模式是深度优先遍历和广度优先遍历, 深度优先一般用递归,广度优先一般用队列。一般情况下能用递归实现的算法大部分也能用堆栈来实现。 1.二叉树的节点表示以及树的创建 通过使用Node类中定义三个属性,分别为elem本身的值,还有lchild左孩子和rchild右孩子 树的创建,创建一个树的类,并给一个root根节点,一开始为空,随后添加节点 class Tree(object): """树类""" def __init__(self, root=None): self.root = root def add(self, elem): """为树添加节点""" node = Node(elem) # 如果树是空的,则对根节点赋值 if self.root == None: self.root = node else: queue = [] queue.append(self.root) # 对已有的节点进行层次遍历 while queue: # 弹出队列的第一个元素 cur = queue.pop(0) if cur.left_child == None: cur.left

ES6 --(7)数组的扩展

ぐ巨炮叔叔 提交于 2019-12-03 04:22:07
2019-11-01 我的学习: 🌟一、扩展运算符:…   将一个数组转为用逗号分隔的参数序列。多用于函数中。不再需要 apply 方法,将数组转为函数的参数了。   注意: 只有函数调用时,扩展运算符才可以放在圆括号中,否则会报错。 (...[1, 2]) // Uncaught SyntaxError: Unexpected number console.log((...[1, 2])) // Uncaught SyntaxError: Unexpected number console.log(...[1, 2]) // 1 2   … 与 apply的效果: // ES5 的写法 Math.max.apply(null, [14, 3, 77]) // ES6 的写法 Math.max(...[14, 3, 77]) // 等同于 Math.max(14, 3, 77); 应用: (1)深拷贝数组: const a1 = [1, 2]; const a2 = a1; a2[0] = 2; a1 // [2, 2] 浅拷贝,仅拷贝指针 //ES5 的深拷贝: const a1 = [1, 2]; const a2 = a1.concat(); a2[0] = 2; a1 // [1, 2] // ES6: const a1 = [1, 2]; // 写法一 const a2

C#遍历DataSet

橙三吉。 提交于 2019-12-03 04:12:18
1 var dt = dataset.Tables[0] 2 foreach (DataRow dr in dt.Rows) ///遍历所有的行 3 foreach (DataColumn dc in dt.Columns) //遍历所有的列 4 Console.WriteLine(“{0}, {1}, {2}”, dt.TableName, dc.ColumnName, dr[dc]); //表名,列名,单元格数据 5 6 foreach (DataRow mDr in dataSet.Tables[0].Rows) 7 { 8 foreach (DataColumn mDc in dataSet.Tables[0].Columns) 9 { 10 Console.WriteLine(mDr[mDc].ToString()); 11 } 12 } 13 14 //遍历一个表多行一列 15 foreach (DataRow row in DataSet1.Tables[0].Rows) 16 { 17 Console.WriteLine(row[0].ToString()); 18 } 19 20 //一行一列 21 ds.Tables[0].Rows[0]["字段"]; 22 //访问一行中的某个元素 23 dr.ItemArray[i].ToString(); 来源:

160行代码仿Vue实现极简双向绑定[详细注释]

回眸只為那壹抹淺笑 提交于 2019-12-03 04:09:35
本文转载于: 猿2048 网站➵ https://www.mk2048.com/blog/blog.php?id=h0j01ikb2j 前言 现在的前端面试不管你用的什么框架,总会问你这个框架的双向绑定机制,有的甚至要求你现场实现一个双向绑定出来,那对于没有好好研究过这方面知识的同学来说,当然是很难的, 接下来本文用160行代码带你实现一个极简的双向绑定机制 。如果喜欢的话可以点波赞/关注,支持一下,希望大家看完本文可以有所收获。 本文是在 面试题:你能写一个Vue的双向数据绑定吗? 的基础上仔细研究+改动,并添加了详细注释,而成的。 个人博客了解一下: obkoro1.com 效果GIF: demo地址: codepen: 仿Vue极简双向绑定 Github: 仿Vue极简双向绑定 了解Object.defineProperty(): 这个API是实现双向绑定的核心,最主要的作用是重写数据的 get 、 set 方法。 使用方式: let obj = { singer: "周杰伦" }; let value = "青花瓷"; Object.defineProperty(obj, "music", { // value: '七里香', // 设置属性的值 下面设置了get set函数 所以这里不能设置 configurable: false, // 是否可以删除属性 默认不能删除

Python中生成器和迭代器的区别

我的未来我决定 提交于 2019-12-03 03:24:39
Python中生成器和迭代器的区别(代码在Python3.5下测试): Num01–>迭代器 定义: 对于list、string、tuple、dict等这些容器对象,使用for循环遍历是很方便的。在后台for语句对容器对象调用iter()函数。iter()是python内置函数。 iter()函数会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内的元素。next()也是python内置函数。在没有后续元素时,next()会抛出一个StopIteration异常,通知for语句循环结束。 迭代器是用来帮助我们记录每次迭代访问到的位置,当我们对迭代器使用next()函数的时候,迭代器会向我们返回它所记录位置的下一个位置的数据。实际上,在使用next()函数的时候,调用的就是迭代器对象的 _next_ 方法(Python3中是对象的 _next_ 方法,Python2中是对象的next()方法)。所以,我们要想构造一个迭代器,就要实现它的 _next_ 方法。但这还不够,python要求迭代器本身也是可迭代的,所以我们还要为迭代器实现 _iter_ 方法,而 _iter_ 方法要返回一个迭代器,迭代器自身正是一个迭代器,所以迭代器的 _iter_ 方法返回自身self即可。 一些术语的解释: 1,迭代器协议:对象需要提供next()方法,它要么返回迭代中的下一项

LeetCode | 208. 实现 Trie (前缀树)

本秂侑毒 提交于 2019-12-03 02:42:18
原题 ( Medium ):   实现一个 Trie (前缀树),包含 insert , search , 和 startsWith 这三个操作。       说明: 你可以假设所有的输入都是由小写字母 a-z 构成的。 保证所有输入均为非空字符串。 思路:    我还是第一次接触到前缀树这个结构,所以这里就先介绍一下何为前缀树。前缀树是一个有根的树,但一般根节点为空,其每个节点具有一下特点: 最多可有R个子节点,其中每个子节点对应字母表一个字母,本题设定R为26。 一个布尔变量,以指定节点是对应键的结尾还是键的前缀   其中键为一个完整的字符串。   向前缀树插入键,即如何向前缀树中插入一个完整的字符串呢。我们可以从根节点出发(空),搜寻其子节点集合里是否已经有对应于字符串第一个字符的字符: 如果有,那么进入该字符对应的子节点,继续搜索下一个字符串字符 如果不存在,就为当前节点创建一个子节点,该节点与当前遍历到字符对应   如何对应呢?我们知道每个节点存在一个子节点集合,我们可以使用指针数组来表示该集合。我们限定一个节点至多只有26个子节点,所以数组大小为26。既然如此,我们可以利用数组下标来对应字母表里的字母,例如0对应a,1对应b......如此类推,那么如何做到这般的对应呢?使用插入或检索时,字符变量与字符常量a相减得到的结果就是其对应的数字。   重复以上步骤

第3次作业-MOOC学习笔记:Python网络爬虫与信息提取

本小妞迷上赌 提交于 2019-12-03 02:18:38
。1.注册中国大学MOOC 2.选择北京理工大学嵩天老师的《Python网络爬虫与信息提取》MOOC课程 3.学习完成第0周至第4周的课程内容,并完成各周作业 4.提供图片或网站显示的学习进度,证明学习的过程。 5.写一篇不少于1000字的学习笔记,谈一下学习的体会和收获。 学习笔记: Python在编程语言中的重要性不言而喻,这次跟随慕课学习《Python网络爬虫与信息提取》,对Python有了新的认识。 网络爬虫可以做到分析教务系统网络接口,用程序在网上抢最热门的课;爬取网络公开的用户信息,并汇总出售;持续关注某个人的微博或朋友圈,自动为新发布的内容点赞等。而 个人电脑中数据没有联网且没有通过Web服务器以URL形式被网络访问,则不能用爬虫获取。切记,及时能爬取数据,数据的知识产权仍然受保护,商业获利(出售)将涉嫌违法。 Requests库共有7个主要方法:request()、get()、head()、post()、put()、patch()、delete(),名字基本与HTTP的操作相同。 URL格式错误,一般指URL格式不符合规范导致无法建立连接,通常会产生URLRequired错误。如果URL格式正确,可能触发Timeout类错误。 数据推送(push model)一般指将数据发送出去的行为。在Requests库中,post()、put()、patch(

java Map及Map.Entry详解

痞子三分冷 提交于 2019-12-03 02:11:19
------转载 路修远而求索 ( https://www.cnblogs.com/keyi/p/5821668.html ) Map是java中的接口,Map.Entry是Map的一个内部接口。 Map提供了一些常用方法,如keySet()、entrySet(),values()等方法。 keySet()方法返回值是Map中key值的集合; entrySet()的返回值也是返回一个Set集合,此集合的类型为Map.Entry。 Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V>。它表示Map中的一个实体(一个key-value对)。接口中有getKey(),getValue方法。(entry的英文意思是 “记录“) //由以上可以得出,遍历Map的常用方法: 1. Map map = new HashMap(); Irerator iterator = map.entrySet().iterator(); while(iterator.hasNext()) { Map.Entry entry = iterator.next(); Object key = entry.getKey(); } 2.Map map = new HashMap(); Set keySet= map.keySet(); Irerator iterator =

利用二叉树遍历实现学生成绩排序模块设计(二叉排序树)

本秂侑毒 提交于 2019-12-03 01:48:52
源代码: #include <stdio.h> #include <stdlib.h> typedef struct tnode {   int id;   int score;   struct tnode *lchild,*rchild; }stu; void ins_student(stu **p,long id,int score) {   stu *s;   if(*p==NULL)   {     s=(stu *)malloc(sizeof(stu)); //插入学生信息     s->id=id;     s->score=score;     s->lchild=NULL;     s->rchild=NULL;     *p=s;   }   else if(score<(*p)->score)     ins_student(&((*p)->lchild),id,score);   else     ins_student(&((*p)->rchild),id,score); } //创建二叉排序树 stu *create_student() {   int id,score;   stu *root;   root=NULL;   printf("请输入学号和成绩(用,隔开,0结束!)");   printf("\n---------------------