代码改变世界

随笔分类 -  数据结构

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

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

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

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

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

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

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

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

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

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

不解的MergeSort

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

字符串反转的几种实现

2009-04-06 10:44 by yearN, 5082 阅读, 收藏, 编辑
摘要: 今天看了一些微软面试题,其中有一个编程题是:求一个字符串的反串。我试着写了两种方法,然后再拿来与.net中ListT中提供的Reverse()方法来比较一下。我们先生成一个测试字符串:char[] sArr = new char[10000]; //我的测试算法中用到的 for (int i = 0; i 10000; i++) { if (i % 2 == 0) { sArr[i] = 'A'; } else { sArr[i] = 'B'; } } string s = new string(sArr); Listbyte list = new Listbyte(10000 阅读全文

中英文字符串截取大比拼

2009-04-04 20:23 by yearN, 703 阅读, 收藏, 编辑
摘要: 今天忙里偷闲,在网上收集了多个中英文字符串截取算法,测试一下它们哪个算法最优,拿来与大家分享!测试程序如下:char[] sArr = new char[10000]; for (int i = 0; i 10000; i++) { if (i % 2 == 0) sArr[i] = 'A'; else sArr[i] = 'B'; } string s = new string(sArr); for (int i = 0; i sArr.Length; i++) { if (i % 10 == 0) s = s.Insert(i, "中国人"); }这个长度测试起来,够可以了吧,呵呵 阅读全文