遍历

python中迭代器的原理与使用

北城余情 提交于 2020-01-25 01:14:29
python中,一个类只要实现了 __iter__() 方法,则称其为可迭代的,如果其又实现了 next() 方法(在python3中为__next__()方法,本文中不再进行说明),则可称其为迭代器。其中, __iter()__ 方法的用途是返回一个迭代器,并通过返回的迭代器的 next() 来迭代所需的容器。 迭代器的用处,主要是用来遍历一个我们需要的容器,如我们常见的for in循环,通过对于我们自己写的类添加迭代的方法,便可以使得我们的自定义的类可以像内置的列表一样,方便地通过for in来直接遍历。 以下是一个比较简单的迭代器的使用方法。 首先,假设我们有一个类 MyArray ,其中有一个字符串的列表 self.elements class MyArray ( object ) : def __init__ ( self ) : self . elements = [ "e1" , "e2" , "e3" ] self . len = len ( self . elements ) 这时,我们知道,我们是无法直接遍历 MyArray 的,只能通过访问其中的元素来实现。这时,我们可以通过一种简单的方法来使得 MyArray 变成一个可迭代的类。 class MyArray ( object ) : def __init__ ( self ) : self .

前、中、后序遍历二叉树

喜你入骨 提交于 2020-01-25 01:11:19
后序遍历 后序遍历首先遍历左子树,然后遍历右子树,最后访问根结点,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后遍历根结点。即: 若 二叉树 为空则结束返回, 否则: (1)后序遍历左子树 (2)后序遍历右子树 (3)访问根结点 如右图所示 二叉树 后序遍历结果:DEBFCA 中序遍历 中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。若 二叉树 为空则结束返回,否则: (1)中序遍历左子树 (2)访问根结点 (3)中序遍历右子树 如右图所示二叉树,中序遍历结果:DBEAFC 前序遍历 前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问 根结点 ,然后遍历左子树,最后遍历右子树。 若 二叉树 为空则结束返回,否则: (1)访问根结点。 (2)前序遍历左子树 。 (3)前序遍历右子树 。 前序遍历 需要注意的是:遍历左右子树时仍然采用前序遍历方法。 如右图所示 二叉树 前序遍历结果:ABDECF 已知后序遍历和中序遍历,就能确定前序遍历。 来源: CSDN 作者: 这瓜保熟么 链接: https://blog.csdn.net/luzhensmart/article/details/104062758

HashSet

雨燕双飞 提交于 2020-01-24 17:37:17
HashSet的继承类和实现接口以及集合描述 HashSet继承AbstractSet类,实现了Set、Cloneable、Serializable接口。 我们解读后发现 HashSet底层是用散列表来实现的,他是一个无序的,不允许重复的,并且允许null值的集合 HashSet的常用方法以及源码分析 构造器 构造器的底层最终实现的是HashMap,构造器最终调用的都是HashMap的构造器。 增 HashSet 的 add()方法最终调用的是HashMap 的 put 方法,并且Value是一个固定值! 所以说HashSet的集合保存的元素都是使用HashMap去存储,并且元素是作为Key去存储的。Value是一个常量值。add方法返回的boolean类型来判断这个元素是否存在 删 同样,HashSet 的remove()方法也是调用HashMap的remove()方法。boolean类型来返回删除是否成功。 clear()方法以实同样 改 HashSet并不提供改的方法。 查 contains()方法也是调用HashMap的方法。 遍历 HashSet的遍历方法本质上就是HashMap对Key的遍历,所以iterator接口返回的就是KeySet().iterator()。 来源: CSDN 作者: 不会街健的bboy不是一个好程序员 链接: https://blog.csdn

python编程,从入门到实践:第六章

淺唱寂寞╮ 提交于 2020-01-24 07:41:30
python编程,从入门到实践:第六章 6-1 人 :使用一个字典来存储一个熟人的信息,包括名、姓、年龄和居住的城市。该字典应包含键first_name 、last_name 、age 和city 。将存储在该字典中 的每项信息都打印出来。 Personal_information = { 'first_name' : 'jy' , 'last_name' : 'j' , 'city' : 'beijing' , 'age' : '24' , } print ( Personal_information ) 6-2 喜欢的数字 :使用一个字典来存储一些人喜欢的数字。请想出5个人的名字,并将这些名字用作字典中的键;想出每个人喜欢的一个数字,并将这些数字作为值存 储在字典中。打印每个人的名字和喜欢的数字。为让这个程序更有趣,通过询问朋友确保数据是真实的。 Favorite_num = { 'a' : '1' , 'b' : '2' , 'c' : '3' , 'd' : '4' , 'e' : '5' , } for name , num in Favorite_num . items ( ) : print ( name + " favorite num is " + num ) 6-3 词汇表 :Python字典可用于模拟现实生活中的字典,但为避免混淆,我们将后者称为词汇表。

Morris 遍历

心已入冬 提交于 2020-01-24 06:54:31
1. 二叉树遍历 树是最重要的数据结构之一,而树的遍历是树最基本的操作。 二叉树的遍历一般来说有三种遍历次序: 前序遍历 中序遍历 后序遍历 而这三种遍历次序都可以采用 递归 和 非递归 的方式来完成。 就时间、空间的复杂度来讲,因为非递归需要借助额外的 Stack 来完成操作,所以递归和非递归的时间复杂度都是 O(n) , O(logn) 。 那么有没有另外的不同的二叉树遍历方法,在时间或空间能做到更优的呢?答案是: Morris 遍历 。 由于在遍历的时候,我们需要记住某种遍历次序的的 后驱 或者 前驱 结点,常见的递归和非递归都是采用 栈 的方式完成这个过程,有没有内部空间来记录这些后驱或者前驱结点呢?有,那就是叶结点的左,右孩子结点,因为叶结点的两个孩子结点都是空指针,如果利用好这些空间,我们就可以在 O(1) 的空间完成遍历。 利用叶结点的左、右孩子指向遍历的前驱或者后驱结点,这些指针叫做 线索 ,对应的二叉树叫做 线索二叉树 。 Morris遍历 是使用线索二叉树进行中序遍历的一种实现 ,其可以在 O(n) 的时间, O(1) 的空间完成遍历, 对其稍加修改可以推广到 先序、后序遍历 ,其遍历过程包含三个部分: 创建指向 中序后驱 结点的线索; 遍历输出结点; 删除线索,恢复树的结构; 2. Morris 中序遍历 Morris 中序遍历过程如下:

sql server数据库遍历并修改

一笑奈何 提交于 2020-01-24 06:15:31
sql server 游标的运用 昨天由于要对数据库中大片没有插入的数据进行修复,因此想到了遍历每条数据和修改遍历的数据。 由于并没有有序的字段,不能简单的用while循环,因此,需要用到游标。 下面对sql 语句进行分析。 begin declare @pid varchar(50) declare @path varchar(260) declare @date varchar(50) declare @rpath varchar(260)//前4行是声明的变量 declare order_cursor cursor for(select[Patient_ID]from [HisReport1].[dbo].[His_report] where report_Date between ‘2017-01-05’ and ‘2017-01-06’)//第五、六行用于声明一个游标,并指明游标作用范围 open order_cursor//打开一个游标 fetch next from order_cursor into @pid //将查到结果的第一个值赋给变量pid while @@FETCH_STATUS=0//开始进行循环,判断fetch的状态 begin select @date=exam_date from [zhilikangDrPacs].[dbo].[dicom

二叉树的前中后序遍历

穿精又带淫゛_ 提交于 2020-01-24 02:21:21
前中后序遍历的递归方式。 其实,前中后序的遍历,走的路径是一样的,只是访问结点的时间不同而已。 非递归进行前中后序遍历(使用栈) 题目描述: List preorderTraversal(TreeNode root) List inorderTraversal(TreeNode root) List postorderTraversal(TreeNode root) 题目链接: https://leetcode-cn.com/problems/binary-tree-preorder-traversal/ https://leetcode-cn.com/problems/binary-tree-inorder-traversal/ https://leetcode-cn.com/problems/binary-tree-postorder-traversal/ 1.前序遍历 public List < Integer > preorderTraversal ( TreeNode root ) { List < Integer > list = new LinkedList < > ( ) ; //迭代解决 使用栈 LinkedList < TreeNode > stack = new LinkedList < > ( ) ; TreeNode tmp = root ; while

LeetCode 113. Path Sum II

元气小坏坏 提交于 2020-01-24 01:45:41
题目链接: 点击这里 思路:二叉树的先序遍历 从根节点深度遍历二叉树,先序遍历时,将该节点值存储至 p a t h path p a t h 栈 中 (vector实现),使用 p a t h _ v a l u e path\_value p a t h _ v a l u e 累加节点值。 当遍历至叶结点时,检查 p a t h _ v a l u e path\_value p a t h _ v a l u e 值是否为 s u m sum s u m ,若为 s u m sum s u m ,则将 p a t h path p a t h p u s h push p u s h 进入 r e s u l t result r e s u l t 结果中。 在回溯时,将该节点值从 p a t h path p a t h 栈 中弹出, p a t h _ v a l u e path\_value p a t h _ v a l u e 减去节点值。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {}

力扣 OJ 94. 二叉树的中序遍历

前提是你 提交于 2020-01-24 01:41:32
题目: 给定一个二叉树,返回它的中序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 代码: /* struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; */ class Solution { public: vector<int> inorderTraversal(TreeNode* root) { vector<int>v1; if (root == NULL)return v1; v1 = inorderTraversal(root->left); v1.insert(v1.end(), root->val); vector<int>v2 = inorderTraversal(root->right); v1.insert(v1.end(), v2.begin(), v2.end()); return v1; } }; 来源: CSDN 作者: csuzhucong 链接: https://blog.csdn.net/nameofcsdn/article/details/104075416

《算法笔记》9.4小节——数据结构专题(2)->二叉查找树(BST)->问题 A: 二叉排序树

微笑、不失礼 提交于 2020-01-23 20:10:23
问题 A: 二叉排序树 时间限制: 1 Sec 内存限制: 32 MB 提交: 519 解决: 225 [ 提交 ][ 状态 ][ 讨论版 ][命题人:外部导入] 题目描述 输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。 输入 输入第一行包括一个整数n(1<=n<=100)。接下来的一行包括n个整数。 输出 可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序、中序和后序遍历。每种遍历结果输出一行。每行最后一个数据之后有一个空格。 样例输入 1 2 2 8 15 4 21 10 5 39 样例输出 2 2 2 8 15 8 15 15 8 21 10 5 39 5 10 21 39 5 10 39 21 [ 提交 ][ 状态 ] #include<iostream> using namespace std; struct node{ int data; node *lchild; node *rchild; }; node *newNode(int v){ node *root=new node; root->data=v; root->lchild=root->rchild=NULL; return root; } void insert(node *&root,int x){ if(root==NULL){ root