遍历

二叉树四种遍历方法

ぃ、小莉子 提交于 2020-02-26 11:01:27
class Node ( object ) : def __init__ ( self , item ) : self . item = item self . lchild = None self . rchild = None class Tree ( object ) : """二叉树""" def __init__ ( self ) : self . root = None def add ( self , item ) : node = Node ( item ) if self . root is None : self . root = node return None queue = [ self . root ] while queue : cur = queue . pop ( 0 ) if cur . lchild is None : cur . lchild = node return None else : queue . append ( cur . lchild ) if cur . rchild is None : cur . rchild = node return None else : queue . append ( cur . rchild ) def breadth_travel ( self ) : """广度遍历""" queue =

c_783_Minimum_Distance_Between_BST_Nodes

元气小坏坏 提交于 2020-02-26 10:34:44
// // Created by Mr.Hu on 2018/9/13. // // 题目给定一个二叉搜索树,要求寻找树节点中两个节点差最小的值(都取绝对值)。 // // 刚开始理解这个题目以为是找相邻两个节点,即父子节点,之间的距离最小值,使用一个递归的方法可以找出该值, // 但是在提交之后,出现了没有通过的case,发现是树中所有节点两两差值最小。 // // 所以想到BST的特点,即节点的值大于其左子树所有节点的值,小于其右子树所有节点的值。 // 因此我们对BST采用中序遍历,并将每个节点的值存储在vector中,由于是中序遍历,最后vector是按照从小到大的顺序排列, // 这也是BST的一种性质。此时我们可以计算vector中相邻两个数的差值并取其中的最小值进行返回。 // // 这个题目我主要用到了中序遍历,用stack来存储访问过的节点,由于深度优先搜索会回溯到之前的节点, // 所以我们在将节点的左孩子节点压入栈中后,将该节点的left定义为nullptr,而将节点的右孩子节点压入栈中之前,我们将该节点pop(), // 这是为了不重复方法该节点。如果是后序遍历就不需要。这也是中序遍历的一个注意点。 // 另外:深度优先搜索用stack保留访问过的节点,广度优先搜索用queue保留访问过的节点。并且在访问节点后,需要根据实际情况定义一些操作来防止重复访问。

数据结构与算法:链表

谁都会走 提交于 2020-02-26 10:29:37
一、链表和数组的区别 链表与数组相似,但链表是一种比数组稍微复杂的数据结构。数组需要一块连续的内存空间来存储数据,对内存的要求比较高,而链表则不需要,它通过「指针」将不连续的内存块串联起来。如果要申请一个 100MB 大小的数组和链表,当内存中没有连续的,或者没有足够大小的空间时,数组便会申请失败,而链表不会。 链表有很多种结构,常见的有: 单链表 、 双向链表 、 循环链表 。 二、单向链表 链表通过指针将不连续的内存块串联在一起使用,我们把其中的内存块称为「结点」,而为了将所有的结点串起来,链表中的结点除了存储数据之外,还会用指针记录链表结点的下一个结点的地址,我们把这个记录下一个结点的地址的指针叫做「后继指针next」,整个单链表如下图所示。 其中第一个结点和最后一个结点是比较特殊的,通常分别把它们称为「头结点」和「尾结点」。头结点用来记录链表的基地址,有了它就能遍历得到整个链表。尾结点并不指向任何结点,而是指向空地址 null ,表示链表上的最后一个结点。 与数组不同,链表的插入和删除操作并不需要大量的数据搬移,它只需要考虑相邻结点的指针改变,对应的时间复杂度为 O(1) 。同样,链表的访问元素操作也没有数组那样直接用首地址和下标通过寻址公式直接得到对应的内存地址,链表需要通过从指针一个一个结点地遍历,直到找到相应的结点。因此链表的随机访问时间复杂度为 O(n) 。 三

从零开始的深度学习--4

筅森魡賤 提交于 2020-02-26 07:29:21
引入注意力机制的seq2seq(编码器-解码器) 在之前的练习中,解码器在各个时间步依赖相同的背景变量(context vector)来获取输入的序列信息。当编码器为循环神经网络时,背景变量来自它最终时间步的隐藏状态。将源序列输入信息以循环单位状态编码,然后将其传递给解码器以生成目标序列。 然而这种结构存在着问题,尤其是RNN机制实际中存在长程梯度消失的问题,对于较长的句子,我们很难寄希望于将输入的序列转化为定长的向量而保存所有的有效信息,所以随着所需翻译句子的长度的增加,这种结构的效果会显著下降。 解码器只能隐式地从编码器的最终状态中选择相应的信息。然而,注意力机制可以将这种选择过程显式地建模。 注意力机制框架 Attention 是一种通用的带权池化方法,输入由两部分构成:询问(query)和键值对(key-value pairs)。对于一个query来说,attention layer 会与每一个key计算注意力分数并进行权重的归一化,输出的向量则是value的加权求和,而每个key计算的权重与value一一对应 为了计算输出,我们首先假设有一个函数α用于计算query和key的相似性,然后可以计算所有的 attention scores , 之后用Softmax函数将其归一化,获得注意力权重, 最终的输出就是value的加权求和: 不同的attetion

shell脚本:遍历删除

倖福魔咒の 提交于 2020-02-26 02:35:04
遍历删除文本内路径上文件 windows上测试可以安装Git linux中,准备删除文件的脚本deleteFile.sh,picture.txt保存待删除文件的文件路径,picture文件夹下面有三张待删除图片a/b/c.jpg deleteFile.sh脚本如下: #!/bin/bash #shell脚本 保存路径的文本 #./deleteFile.sh ./picture.txt #判断位置参数是否为1 if [ $# -ne 1 ];then echo "Usage $0 filename" exit fi #判断位置参数是否为文件 if [ ! -f $1 ];then echo "the $1 is not a file" exit fi #待删除文件路径的文本 filename=$1 echo "filename: $filename" >> info.txt #计算待删除的文件数量(总行数) NUM=`sed -n '$=' $filename` echo "picture delete num: $NUM" #逐行读取文件内容并删除对应路径的文件 success=0 for i in `cat $filename` do #成功信息重定向输出到info.txt echo "delete success: $i" >> info.txt rm -rf $i

JSON遍历方法

天大地大妈咪最大 提交于 2020-02-26 01:21:42
json 数组有长度json.abc.length,如果单纯是json格式,那么不能直接使用json.length方式获取长度,而应该使用其他方法。 最近在修改一个 html 页面的 JS 的时候遍历JSON对象,却怎么也调试不通过。怪这个HTML网页不知道用了什么方法禁止了 js 错误提示,刚开始的时候不知道有这个问题,用chrome的开发人员工具都没发现错误,就是在获取 json.length的时候总是undefined,所以就以为自己定义的json方法不对。折腾了一个晚上一点进展都没有,头都整晕了,太晚,最后失望地洗洗睡了。 第二天晚上就是不甘心这个小问题能难倒我,于是静下心来仔细查原因。自己新建一个空的HTML文件在其中测试,发现JSON对象根本没有length属性,在搜索引擎查找也没有比较权威的参考文档提到json有这个属性。博客也很少有提到 json.length 的。但是奇怪的是我明明记得json有length,我还用过,程序没错,正确运行。 那是怎么回事呢?最后看某博客一篇文章的时候回想起以前编程的细节,记得以前的json的子对象是个数组而这次的不是,这下终于恍然大悟了。 以前我使用json的这样的结构: var json1={"abc":[{"name":"txt1"},{"name","txt2"}]}; 遍历的方法是: for(var i=0;i<json1

问题 D: 二叉树遍历

此生再无相见时 提交于 2020-02-25 22:40:23
题目链接 : http://codeup.cn/problem.php?cid=100000611&pid=3 题目描述 编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。 输入 输入包括1行字符串,长度不超过100。 输出 可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。 样例输入 a#b#cdef##### a## 样例输出 a b f e d c a 代码 # include <cstdio> char pre [ 110 ] ; int i ; struct node { char data ; node * lchild ; node * rchild ; } ; node * create ( ) { if ( pre [ i ] == '#' ) { i ++ ; return NULL ; } node * root = new node ; root -> data = pre [ i ] ; i ++ ; root -> lchild = create ( ) ; root ->

递归构造二叉树和二叉树的遍历

时光总嘲笑我的痴心妄想 提交于 2020-02-25 19:25:01
学习递归构造二叉树,并且进行前序遍历。 前序遍历,中序遍历和后序遍历是什么? 遍历的顺序分别如下: 前序遍历: 根节点 ,左子树,右子树; 中序遍历:左子树, 根节点 ,右子树; 后序遍历:左子树,右子树, 根节点 。 明眼人可能看出来了:这里的前中后指的是 根节点的位置 。 前序遍历是根节点在前,中序遍历指根节点在中间遍历,中序遍历又叫做“投影遍历”,顺序基本上没变。 递归生成树的代码: //定义 结点结构体 struct tnode { T data ; tnode < T > * left ; tnode < T > * right ; tnode < T > * parent ; } ; //递归生成树的函数 //返回指向根节点的指针 double alpha ; //根节点的比例 template < typename iterator > //迭代器类型 iterator tree_generation ( iterator start , size_t n ) { if ( n < 1 ) return NULL ; size_t c = ( n - 1 ) * alpha ; //根相对位置 iterator root = start + c ; //根节点的位置 iterator left_subtree = tree_generation ( start , c

关于map 的几种方式

*爱你&永不变心* 提交于 2020-02-25 13:04:21
java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是 HashMap Hashtable LinkedHashMap 和TreeMap. Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。 Hashmap 是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。 HashMap最多只允许一条记录的键为Null(如果建是null存在数组的第一个位置);允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致 。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。 默认初始化的时候是16个数组的大小,而且增长是成倍的增长。 Hashtable 与 HashMap类似,它继承自Dictionary类,不同的是: 它不允许记录的键或者值为空;它支持线程的同步 ,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。 默认初始化的时候是11个数组的大小,而且增长是old*2+1 public Hashtable() {

根据前序遍历和中序遍历重建二叉树

戏子无情 提交于 2020-02-25 08:00:55
package com.study; /* * 根据二叉树的前序遍历和中序遍历结果重建二叉树 * 并输出其头节点。假设前序遍历和中序遍历结果中没有重复数字 * 前序遍历序列:{1,2,4,7,3,5,6,8} * 中序遍历序列:{4,7,2,1,5,3,8,6} * **/ class TreeNode { public int data; public TreeNode left; public TreeNode right; public TreeNode() { } } public class suanfa4 { private static int[] arr1 = {1,2,4,7,3,5,6,8}; private static int[] arr2 = {4,7,2,1,5,3,8,6}; public static TreeNode RebuildBinaryTree() { TreeNode head = null; head = ConstructBTree( head ,arr1, 0, 7, arr2, 0, 7); return head; } public static TreeNode ConstructBTree(TreeNode node, int[] pre, int pre_start, int pre_end, int[] inorder,