遍历

非递归遍历二叉树(详解)

扶醉桌前 提交于 2019-12-19 03:19:05
本文转载自: http://blog.csdn.net/zhangxiangdavaid/article/details/37115355 前言   对于二叉树的递归遍历比较简单,所以本文主要讨论的是非递归版。其中,中序遍历的非递归写法最简单,后序遍历最难。    节点的定义: //Binary Tree Node typedef struct node { int data; struct node* lchild; //左孩子 struct node* rchild; //右孩子 }BTNode;   首先,有一点是明确的:非递归写法一定会用到栈,这个应该不用太多的解释。我们先看中序遍历: 中序遍历 分析   中序遍历的递归定义:先左子树,后根节点,再右子树。如何写非递归代码呢?一句话:让代码跟着思维走。我们的思维是什么?思维就是中序遍历的路径。假设,你面前有一棵二叉树,现要求你写出它的中序遍历序列。如果你对中序遍历理解透彻的话,你肯定先找到左子树的最下边的节点。那么下面的代码就是理所当然的: 中序代码段(i) BTNode* p = root; //p指向树根 stack <BTNode*> s; //STL中的栈 //一直遍历到左子树最下边,边遍历边保存根节点到栈中 while (p) { s.push(p); p = p->lchild; }  

java集合常见问题

别等时光非礼了梦想. 提交于 2019-12-19 00:09:29
Java集合 常见的集合问题 HashMap与HashTable的区别 HashMap的put方法的具体流程? HashMap 解决哈希冲突 什么是哈希? 什么是哈希冲突? HashMap为什么不直接使用hashCode()处理后的哈希值直接作为table的下标? HashMap在JDK1.7和JDK1.8中有哪些不同? 为什么HashMap中String、Integer这样的包装类适合作为K? ConcurrentHashMap和Hashtable的区别? Java集合的快速失败机制 “fail-fast” ArrayList 和 Vector 的区别? ArrayList和LinkedList的区别? Array 和 ArrayList 有什么区别?什么时候该应 Array 而不是 ArrayList 呢? HashSet是如何保证数据不可重复的? BlockingQueue是什么? 转自 https://zhuanlan.zhihu.com/p/82714518 常见的集合问题 Map 接口和 Collection 接口是所有集合框架的父接口: Collection 接口的子接口包括: Set 接口和 List 接口 Map 接口的实现类主要有: HashMap 、 TreeMap 、 Hashtable 、 ConcurrentHashMap 以及 Properties 等

JAVA实训第二次作业

烂漫一生 提交于 2019-12-18 23:46:54
一维数组的创建和遍历。 声明并创建存放4个人考试成绩的一维数组,并使用for循环遍历数组并打印分数。要求: (1) 首先按“顺序”遍历,即打印顺序为:从第一个人到第四个人; (2) 然后按“逆序”遍历,即打印顺序为:从从第四个人到第一个人; (3) 输出最高分; (4) 输出最低分; Arrays类的sort方法的理解与应用(参照110页程序)。 对无序的10个数字使用Arrays类的sort方法进行排序。要求: ² 声明并初始化数组 ² 按如下格式输出排序后的数组 sum[0] = 1 sum[1] = 2 一个班级的学生成绩存在长度为10的数组中,计算不及格的学生数目。 身份证号码的判断。 声明String类型的字符串,保存身份证号码。编写程序判断: 1)该号码是否为湖南长沙的号码(判断依据:前4位为4301,即长沙号码;否则不是长沙号码)。 2)该号码主人的性别(判断依据:第17位为奇数,性别为男;第17位为偶数,性别为女)。 附加:实现一个二维数组的转置,操作过程是将二维数组表示的矩阵对应的每一个元素number[i][j]被置为number[j][i]。要求: 可以借助一个新的数组来完成转置 如果不借助新的数组完成转置。 转置举例: 1 2 3 1 4 7 4 5 6 2 5 8 7 8 9 3 6 9 来源: https://www.cnblogs.com

数据结构---二叉树遍历

和自甴很熟 提交于 2019-12-18 22:27:55
二叉树遍历可以使用 深度优先遍历 和 广度优先遍历 ,深度优先又可以分为 前序、中序、后序 三种方式遍历,每种方式都可以通过递归和非递归方法实现。 一、深度优先递归遍历: 前序遍历算法: 先遍历根结点 再递归遍历左子树 最后递归遍历右子树 首先访问根结点A; 遍历A结点的左子树,B结点。 B结点有子结点,再按照前序遍历方式遍历,先访问根结点,即B; 遍历B结点左子树,D结点; D结点没有子结点,遍历B结点的右子树,E结点;到此,B结点的根结点、左子树、右子树、已经遍历完成; 遍历A结点的右子树,C结点; C结点有子结点,再按照前序遍历方式遍历,先访问根结点,即C; 遍历C结点左子树,F结点; F结点没有子结点,遍历C结点的右子树,G结点;到此,C结点的根结点、左子树、右子树、已经遍历完成; 最终的访问顺序为:A->B->D->E->C->F->G 代码实现: 结点类: //结点 public class TreeNode { private String data ; private TreeNode left ; private TreeNode right ; public TreeNode ( String data , TreeNode left , TreeNode right ) { this . data = data ; this . left = left ;

数据结构——图的遍历

此生再无相见时 提交于 2019-12-18 20:43:43
从已给的 连通图 中某一顶点出发,沿着一些边访遍图中所有的顶点,且使 每个顶点仅被访问一次 ,就叫做图的遍历,它是图的基本运算。其本质为 ● 深度优先遍历 从图中某顶点 v 出发;访问它的任一邻接顶点 w1;再从 w1 出发,访问与 w1邻接但还未被访问过的顶点 w2;然后再从 w2 出发,进行类似的访问……直至到达所有的邻接顶点都被访问过的顶点 u 为止。 退回一步,退到前一次刚访问过的顶点,看是否还有其它没有被访问的邻接顶点。如果有,则访问此顶点,之后再从此顶点出发,进行与前述类似的访问;如果没有,就再退回一步进行搜索。 重复上述过程,直到连通图中所有顶点都被访问过为止 bool visited [ MVNum ] ; 图G为邻接矩阵类型 void DFS ( AMGraph G , int v ) { cout << v ; visited [ v ] = true ; //访问第v个顶点 //依次检查邻接矩阵v所在的行 for ( w = 0 ; w < G . vexnum ; w ++ ) if ( ( G . arcs [ v ] [ w ] != 0 ) && ( ! visited [ w ] ) ) DFS ( G , w ) ; //w是v的邻接点,如果w未访问,则递归调用DFS } //时间复杂度为O(n^2) 图G为邻接表类型 void DFS (

数据结构实验之求二叉树后序遍历和层次遍历

☆樱花仙子☆ 提交于 2019-12-18 18:58:12
数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历和层序遍历。 Input 输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据。每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列。 Output 每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列。 Sample Input 2 abdegcf dbgeafc xnliu lnixu Sample Output dgebfca abcdefg linux xnuli 实现代码 #include <bits/stdc++.h> using namespace std; char s1[55],s2[55]; typedef struct node { char data; struct node *l,*r; } tree; tree *creat(int n,char *s1,char *s2) { int i; if(n==0) return NULL; tree *root; root = new tree; root->data=s1[0]; for(i=0;

数据结构和算法之二叉树锯齿遍历

陌路散爱 提交于 2019-12-18 15:43:40
题:按照如图方式遍历二叉树 个人思路: 1、用两个栈实现,奇数层用第一个栈,偶数层放第二个栈 /** * 层序遍历数组,锯齿形遍历 * 第二层遍历顶点 * 第二层按照右向左遍历 * 第三层按照左向右遍历 * 第四层按照右向左遍历 * 依次。。。。 * Author : BlueSky 2019.11.15 * 4 * 2 6 * 1 3 5 7 * 输出:4 6 2 1 3 5 7 */ public class LayerTreeV2 { public void foreachV1 ( TreeNode treeNode ) { if ( treeNode == null ) { return ; } List < List < Integer > > list = new ArrayList < List < Integer > > ( ) ; Stack < TreeNode > stackLeftFirst = new Stack < TreeNode > ( ) ; Stack < TreeNode > stackRightFirst = new Stack < TreeNode > ( ) ; stackLeftFirst . push ( treeNode ) ; //int high = 2; while ( ! stackLeftFirst . empty ( )

python中字典的循环遍历的两种方式

别等时光非礼了梦想. 提交于 2019-12-18 12:52:31
本文转载自: https://www.cnblogs.com/paranoia/p/6164425.html 作者:paranoia 转载请注明该声明。 开发中经常会用到对于字典、列表等数据的循环 遍历 ,但是 python 中对于字典的遍历对于很多初学者来讲非常陌生,今天就来讲一下python中字典的循环遍历的两种方式。 注意: python2和python3中,下面两种方法都是通用的。 1. 只对键的遍历 一个简单的for语句就能循环字典的所有键,就像处理序列一样: 1 2 3 4 5 6 d = { 'name1' : 'pythontab' , 'name2' : '.' , 'name3' : 'com' } for key in d: print (key, ' value : ' , d[key]) name1 value : pythontab name2 value : . name3 value : com 2. 对键和值都进行遍历 如果只需要值,可以使用d.values,如果想获取所有的键则可以使用d.keys。 如果想获取键和值d.items方法会将键-值对作为元组返回,for循环的一大好处就是可以循环中使用序列解包。 代码实例: 1 2 3 4 5 for key, value in d.items(): print (key, ' value : ' ,

js当中数组和list遍历的时候,跳过本次循环执行下一次循环,以及跳出循环

谁都会走 提交于 2019-12-18 05:57:06
跟后端开发不同,后端开发循环遍历一个list,当满足条件需要跳过当前循环,执行下一次循环时,用 continue关键字,但是js中不一样,用ture或者false你敢信。。。。 来源: CSDN 作者: 我是王小贱 链接: https://blog.csdn.net/qq_34377273/article/details/103580914

GO语言遍历数组以及range遍历

▼魔方 西西 提交于 2019-12-18 02:45:20
普通的遍历 func main ( ) { arr ( ) } func arr ( ) { arr1 := [ 5 ] int { 1 , 2 , 3 , 4 , 5 } for i := 0 ; i < len ( arr1 ) ; i ++ { fmt . Println ( arr1 [ i ] ) } } 使用range遍历 Go 语言中 range 关键字用于 for循环中迭代数组(array)、切片(slice)、链表(channel)或集合(map)的元素; 在数组和切片中它返回元素的索引值, 在集合中返回 key-value 对的 key 值。 package main import "fmt" func main ( ) { arr ( ) } func arr ( ) { arr1 := [ 5 ] string { "a" , "b" , "c" , "d" , "e" } for k , v := range arr1 { fmt . Printf ( "key:%d value:%s\n" , k , v ) } } 来源: CSDN 作者: qq_23569917 链接: https://blog.csdn.net/qq_23569917/article/details/103584155