代码改变世界

数据结构与算法回顾之二叉树的遍历(下)

2010-12-13 13:46 by yearN, 1620 阅读, 0 推荐, 收藏, 编辑
摘要:上节我们给出了广度优先遍历算法的实现和深度优先遍历算法的递归实现,本节我们讨论深度优先的三种遍历形式的非递归实现。1.非递归先序遍历:先访问树的根节点,然后是左子树和右子树。根节点入栈,循环判断栈是否为空,如果不为空,出栈跟节点并访问根节点,如果右子树非空,让右子树先入栈;如果左子树非空,再让左子树入栈,执行循环,直到栈中为空。代码如下:2.非递归后序遍历:要遍历树的根节点,后序遍历要求在遍历完左右子树后,再访问根。需要判断根结点的左右子树是否均遍历过。在访问左子树之前和访问右子树之前都有记录下根节点,所以可以用一个辅助的引用q来区分知网两种情况。代码如下:注意只有一个子孙的节点只能被压入一次 阅读全文

数据结构与算法回顾之二叉树的遍历(上)

2010-12-12 21:57 by yearN, 454 阅读, 2 推荐, 收藏, 编辑
摘要:所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。常用的遍历方法有深度优先遍历和广度优先遍历,广度优先遍历就是二叉树的层序遍历,按照自顶向下、自左向右的方式访问二叉树节点。而深度优先遍历可以按某种次序执行三个操作:  (1)访问结点本身(N),  (2)遍历该结点的左子树(L),  (3)遍历该结点的右子树(R)。以上三种操作有六种执行次序:  NLR、LNR、LRN、NRL、RNL、RLN。 前三种次序与后三种次序对称,故只讨论先左后右的前三种次 阅读全文

数据结构与算法回顾之二叉树

2010-12-12 19:16 by yearN, 1151 阅读, 1 推荐, 收藏, 编辑
摘要:二叉树具有如下的性质:在二叉树中,第i层的结点总数不超过2^(i-1); 深度为h的二叉树最多有2^(h)-1个结点(h=1),最少有h个结点; 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2, 则N0=N2+1; 具有n个结点的完全二叉树的深度为int(log2n)+1 ;有N个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系: 若I为结点编号则 如果I1,则其父结点的编号为I/2; 如果2*I=N,则其左儿子(即左子树的根结点)的编号为2*I;若2*IN,则无左儿子; 如果2*I+1=N,则其右儿子的结点编号为2*I+1;若2*I+1 阅读全文

数据结构与算法回顾之递归

2010-12-11 20:22 by yearN, 234 阅读, 0 推荐, 收藏, 编辑
摘要:在编程语言中,把直接或间接地调用自身的函数称为递归函数。函数的构建通常需要一个函数或者一个过程来完成。下面我们来看看几种容易被遗忘的递归形式:1. 尾递归 仅在方法实现的末尾进行一次递归调用。换句话说,当进行调用时,方法的后面已经没有要执行的语句。递归调用不仅是最后一条语句,而且前面也没有直接的或间接的递归调用。例如一个尾递归方法是这样的:下面这个方法 NonTail()不是尾递归: 阅读全文

数据结构与算法回顾之栈和队列

2010-12-11 20:00 by yearN, 797 阅读, 0 推荐, 收藏, 编辑
摘要:1. 栈是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。栈具有“后进先出”特点。栈实现代码:2. 队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。队列具有“先进先出”的特点。队列实现代码: 阅读全文

数据结构与算法回顾之基础排序

2010-12-07 22:29 by yearN, 239 阅读, 0 推荐, 收藏, 编辑
摘要:毕业在即,最近对以前学过的数据结构与算法知识再来复习一下。先来说明一下框架代码:1. 选择排序原理:将序列划分为无序和有序区,寻找无序区中的最小值和无序区的首元素交换,有序区扩大一个,循环最终完成全部排序。代码:2. 插入排序原理:将数组分为无序区和有序区两个区,然后不断将无序区的第一个元素按大小顺序插入到有序区中去,最终将所有无序区元素都移动到有序区完成排序。代码:3. 冒泡排序原理:将序列划分为无序和有序区,不断通过交换较大元素至无序区尾完成排序。代码:4. 希尔排序原理:又称增量缩小排序。先将序列按增量划分为元素个数相同的若干组,使用直接插入排序法进行排序,然后不断缩小增量直至为1,最后 阅读全文

正则基础之 NFA引擎匹配原理(转载)

2010-11-13 21:57 by yearN, 359 阅读, 0 推荐, 收藏, 编辑
摘要:不懂正则引擎原理的情况下,同样可以写出满足需求的正则,但是不知道原理,却很难写出高效且没有隐患的正则。所以对于经常使用正则,或是有兴趣深入学习正则的人,还是有必要了解一下正则引擎的匹配原理的。1 为什么要了解引擎匹配原理一个个音符杂乱无章的组合在一起,弹奏出的或许就是噪音,同样的音符经过作曲家的手,就可以谱出非常动听的乐曲,一个演奏者同样可以照着乐谱奏出动听的乐曲,但他/她或许不知道该如何去改变音符的组合,使得乐曲更动听。作为正则的使用者也一样,不懂正则引擎原理的情况下,同样可以写出满足需求的正则,但是不知道原理,却很难写出高效且没有隐患的正则。所以对于经常使用正则,或是有兴趣深入学习正则的人 阅读全文

thinkPHP中单字母函数(转载)

2010-11-13 11:01 by yearN, 305 阅读, 0 推荐, 收藏, 编辑
摘要:所有的单字母函数都common/functions.php中有定义可以仔细查阅。common/convention.php中是配置信息定义文件。所有在TP里称之为函数的东西,都在框架目录/Common/functions.php这个文件里。有人不太喜欢TP这种单字母函数,其实这也是TP的一个特色,如果理解了这些函数的作用,不管是背,还是写,都是非常方便的,接下来我们以字母顺序开始。A函数A函数是用来实例化我们的Action类的,例如我们的程序有2个Action分别是IndexAction和TestAction,在IndexAction中有个myHello方法能够输出hello world,如果 阅读全文

ASP.NET程序中常用的三十三种代码【转】

2010-10-02 12:18 by yearN, 316 阅读, 0 推荐, 收藏, 编辑
摘要:1. 打开新的窗口并传送参数: 传送参数:response.write("<script>window.open(’*.aspx?id="+this.DropDownList1.SelectIndex+"&id1="+...+"’)</script>")接收参数:string a = Request.QueryString("id");string b = Request.QueryString("id1");2.为按钮添加对话框Button1.Attributes.Add("onclick","return confirm(’确认?’)");button.attributes.add("on 阅读全文

不解的MergeSort

2010-08-15 10:03 by yearN, 304 阅读, 0 推荐, 收藏, 编辑
摘要:最近在学习Power Collections类库,其中Algorithm类中有这么一个算法:MergeSort意思应该可以理解为“归并排序”吧,可这个算法怎么看也不像经典的归并排序,以前我也没遇到过这种排序,感觉这个算法不怎么效率。附上园友的归并排序算法:http://www.cnblogs.com/architect/archive/2009/05/06/1450489.html 阅读全文