遍历

二叉树的遍历

淺唱寂寞╮ 提交于 2020-02-09 07:50:28
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 前序遍历 递归 void preOrder1(BinTree *root) //递归前序遍历 { if(root!=NULL) { cout<<root->data<<" "; preOrder1(root->lchild); preOrder1(root->rchild); } } 非递归 根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看做是根结点,因此可以直接访问,访问完之后,若其左孩子不为空,按相同规则访问它的左子树;当访问其左子树时,再访问它的右子树。因此其处理过程如下: 对于任一结点P: 1)访问结点P,并将结点P入栈; 2)判断结点P的左孩子是否为空,若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P,循环至1);若不为空,则将P的左孩子置为当前的结点P; 3)直到P为NULL并且栈为空,则遍历结束。 void preOrder2

数据结构(三)——二叉树的相关操作

亡梦爱人 提交于 2020-02-09 03:29:59
前言 这里同样不介绍二叉树的相关概念,毕竟数据结构的基础已经讲过很多了,这里不再赘述。至于一些平衡二叉树,完全二叉树,红黑树,B+树等相关结构,这个已经有很多博客介绍了,这里只是介绍一下二叉树的一些基础操作。 定义 这个应该见过多次 /** * autor:liman * createtime:2020/2/6 * comment:二叉树节点的实现 */ public class TreeNode { public String value ; public TreeNode left ; public TreeNode right ; public TreeNode ( String value ) { this . value = value ; } } 遍历的非递归实现 递归的实现非常简单,估计很多人都会,这里就介绍非递归的遍历实现 基本的遍历操作如下:这里示意的输出一下表示遍历操作 /** * 做遍历的操作。 * * @param node */ public static void doTraverse ( TreeNode node ) { System . out . print ( node . value + " " ) ; } 先序遍历 /** * 非递归实现的先序遍历,这里用到了栈的操作 * * @param root */ public static

Python 生成器

孤者浪人 提交于 2020-02-08 23:39:15
生成器 Generator 是迭代器的一种. Review Iterator 上篇呢, 对 迭代器 有过谈到, 从 迭代过程, 迭代对象, 迭代器都进行了说明, 首先要理解概念, 其实理解词性就可以. 迭代器 对 可迭代对象 进行 迭代 . 从主谓宾上就理清了这几个名词. 更通俗一般地理解: 迭代: 在代码中表现为对 某个对象进行 for 遍历 的过程 (包含了 next()) 可迭代对象: 能够被 遍历 的对象, 如 list, tuple, str, dict, range, enumerate, zip .... 迭代器: 能够被 next() 函数调用, 并不断返回下一个值的对象. 即实现了 __ iter __ 和 __ next __ 方法. for 循环原理: 会先调用 __ iter __ 方法, 然后不断调用 __ next __ 方法, 直到捕捉到异常类 StopIteration # for的原理 class A: def __iter__(self): print("__iter__ is called") return self def __next__(self): print("__next__ is called") for i in range(3): print(i) raise StopIteration if __name__ == '_

python 遍历文件夹中所有文件

喜你入骨 提交于 2020-02-08 20:02:26
'''使用walk方法递归遍历目录文件,walk方法会返回一个三元组,分别是root、dirs和files。 其中root是当前正在遍历的目录路径;dirs是一个列表,包含当前正在遍历的目录下所有的子目录名称,不包含该目录下的文件; files也是一个列表,包含当前正在遍历的目录下所有的文件,但不包含子目录。PIL安装时:pip install pillow ''' import os from PIL import Image def ab(path):#遍历指定文件夹中所有文件,检查图像大小,长高小于300的删除,不是图像的文件也删除 for root,dirs,files in os.walk(path): for name in files: print(os.path.join(root,name)) try: aa1=os.path.join(root,name) img=Image.open((aa1)) #打开文件出错的就不是图像文件,删除 except: os.remove(aa1)#删除文件 w=img.width #图像文件长与宽 h=img.height img.close() if w<300 or h<300: os.remove(aa1) print(aa1) #pass path=r"d:\tuajjb" ab(path) dirs=os

数据结构——二叉树的遍历(c/c++)

给你一囗甜甜゛ 提交于 2020-02-08 19:12:10
递归遍历: 二叉树的三种递归遍历为先序遍历,中序遍历和后续遍历。它们相似之处在于都是对二叉树的递归遍历且对任何一个结点都经过三次,区别在于哪一次对该结点进行访问,由此分为先,中,后序遍历。所以对于任一结点都有:三次经过,一次访问。 先序遍历: void preorder(btNode* p) { if (p != NULL) { visit(p); preorder(p->lc); preorder(p->rc); } } 中序遍历: void inorder(btNode* p) { if (p != NULL) { inorder(p->lc); visit(p); inorder(p->rc); } } 后序遍历: void postorder(btNode* p) { if (p != NULL) { postorder(p->lc); postorder(p->rc); visit(p); } } 对于下图中的树: 先序遍历结果为:ABDECF 根 左 右 中序遍历结果为:DBEAFC 左 根 右 后序遍历结果为:DEBFCA 左 右 根 中序与先(后)序可唯一确定一颗二叉树。 层序遍历: 二叉树的层序遍历的实现思路:建立一个辅助数据结构队列,将二叉树头节点入队,在出队时将其左右孩子挨个入队,每出队一个结点,将其左右孩子入队,直至队列为空。 void level

数据结构二叉树的遍历(二)

自作多情 提交于 2020-02-08 17:47:15
数据结构二叉树的遍历(二) 1、二叉树用二叉链表存储,编写算法采用先序遍历查找值为x的结点,找到返回其指针,否则返回NULL。 <span style="font-size:18px;">status serch_x(BinTree t,TreeType x){ if(!t) return NULL; //查找失败 if(t->data==x){ return t;// 查找成功 else{ p=serche_x(p->lchild,x); //查找左子树 if(p) return p; else return serch_x(p->rchild,x) </span><span style="font-size: 18px; font-family: Arial, Helvetica, sans-serif;">//查找右子树</span><span style="font-size:18px;"> } } }</span> 2、二叉树用二叉链表存储,编写算法要求返回二叉树的后序序列中的第一个结点的指针。 <span style="font-size:18px;"><span style="font-size:18px;">status serch_x(BinTree t){ p=t; if(p){ while(p->lchile||p->rchild){ //有孩子 while

Nginx 简述

喜你入骨 提交于 2020-02-08 17:05:43
I/O 模型 同步/异步:关注的是消息通信机制 同步:synchronous 调用者等待被调用者返回信息,再继续执行后续操作 异步:asynchronous 被调用者通过状态、通知或回调机制主动通知调用者被调用者的状态 阻塞/非阻塞模型 阻塞:blocking IO操作需要彻底完成后才回到用户空间,调用结果返回前,调用者被挂起 非阻塞:noblocking IO操作被调用后立即给用户返回一个状态值,无需等待IO彻底完成,最终的调用结果返回前,调用者不挂起 (非阻塞型并不直接使用,程序虽然没有挂起,但是会不断发起IO请求等待答复,消耗大量CPU资源。一般在其他模型中使用) IO多路复用型 有等待机制作(select)为中间调和,负责接收请求,并不直接请求内核。本质上也是阻塞特征,阻塞点在等待机制select 使用场景: 客户端处理多个描述符是(一般为交互输入和网络套接口) 一个TCP服务器既要已连接套接字又要监听套接字 一个服务器要处理TCP、UDP 一个服务器要处理多个服务或协议 具体实现: select:linux实现,对应IO复用模型 poll:linux实现,对应IO复用模型 epoll:linux实现,对应IO复用模型,具有信号驱动IO某些特征 kqueue: FreeBSD实现,IO复用,有信号驱动IO特性 /dev/poll: SUN的Solaris实现 Iocp

非线性数据结构——树

微笑、不失礼 提交于 2020-02-08 16:52:52
树 非线性数据结构定义:也就是每个元素可以有多个前驱和后继。树是一种非线性结构。它可以有两种定义。 第一种:树是n(n>=0, n为0时,称为空树 )个元素的集合,它只有 一个特殊的没有前驱的元素 ,这个元素成为树的 根(root) ,而且 树中除了根节点外,其余的元素都只能有一个前驱,可以有0个或者多个后继。 第二种递归定义:树T是n(n>=0,n为0时,称为空树)个元素的集合,它有且只有一个特殊元素根,剩余元素都可以被划分为M个互不相交的集合T1,T2,T3……、Tm,而每一个集合都是树,称为T的子树subtree,同时,子树也有自己的根。 维基百科是这样定义的: 树中的概念 结点: 树中的数据元素,也就是上图中的,A,B,C,D,E,F,G…… 结点的度degree :节点拥有的子树的数目称为度,记作d(v)。 叶子结结: 节点的度为0,称为叶子节点leaf,终端节点,末端节点。 分支结点: 节点的度不为0,称为非终端节点或分支节点。 分支: 节点之间的关系。 内部节点: 除根节点外的分支节点,当然也不包括叶子节点。 树的度: 树内各节点的度的最大值,比如下面这个图D节点的度最大为3,所以树的度数就是3. 孩子(儿子child)节点: 节点的子树的根节点成为该节点的孩子。 双亲(父parent)节点: 一个节点是他各子树的根节点的双亲。 兄弟(sibling)节点:

树的深度优先搜索和广度优先搜索的实现

南笙酒味 提交于 2020-02-08 14:40:06
1. 深度优先 depth first search,DFS 可以使用先序遍历来实现 递归版 //先序遍历 public void PreOrder ( BinaryTreeNode node ) { if ( node != null ) { System . out . println ( node . getData ( ) ) ; //先访问根节点 PreOrder ( node . getLeftChild ( ) ) ; //先根遍历左子树 PreOrder ( node . getRightChild ( ) ) ; //先根遍历右子树 } } 非递归版(使用栈实现) public ArrayList < Integer > DfsTree ( TreeNode root ) { ArrayList < Integer > lists = new ArrayList < I > ( ) ; if ( root == null ) return lists ; Stack < TreeNode > stack = new Stack < > ( ) ; stack . push ( root ) ; while ( ! stack . isEmpty ( ) ) { TreeNode tree = stack . pop ( ) ;        //先往栈中压入右节点

CCF 201712-2 游戏 python

六月ゝ 毕业季﹏ 提交于 2020-02-08 10:34:13
思路: kid:n个小朋友的编号 num:每次小朋友报的数 遍历kid列表中每个小朋友,完成报数操作,每次报的数(num)是上一个小朋友报的数+1 判断每个小朋友报的数是否符合条件,若符合条件则将该小朋友的编号添加到new_kids中,列表new_kids用于存储每次遍历后剩余小朋友的编号 每次遍历前都将new_kids置为[],遍历完成后将得到的结果赋给kids,以作为下一轮遍历的新列表。这里需要注意new_kids==[]的情况,会在文章最后反思出说明! 遍历终止条件:kids列表的长度为1,即只剩最后一位小朋友,他就是最终获胜者 ''' 测试用例1 5 2 测试用例2 7 3 ''' n , k = map ( int , input ( ) . split ( ) ) kids = [ e + 1 for e in range ( n ) ] # 列表kids为n个小朋友的编号 num = 0 # num为每次小朋友报的数 while len ( kids ) > 1 : new_kids = [ ] # 列表new_kids用来记录每一轮遍历后剩余小朋友的序号 for kid in kids : num += 1 #判读序号为kid的小朋友报出的数是否既不是k的倍数且最后一位不是k if num % k != 0 and num % 10 != k : #注意*** /