
数据结构
DreamtaleL
这个作者很懒,什么都没留下…
展开
-
冒泡排序的链表实现
冒泡排序大家应该都很熟悉,不过平常都是用数组实现的,前几天参加了深信服的笔试,其中编程题第一个就是用链表实现冒泡排序,当时有点懵逼,所以我也不知道自己写的对不对,所以笔试后就认真看了一下这个。 用链表实现冒泡排序有两种方法:一种是交换节点,另一种就是只交换节点的值。原创 2017-04-04 19:28:30 · 952 阅读 · 1 评论 -
堆排的实现
堆排实际上是一种选择排序,堆其实就是一棵完全二叉树,任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为大顶堆,满足 Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]称为小顶堆。由上述性质可知大顶堆的堆顶的关键字肯定是所有关键字中最大的,小顶堆的堆顶的关键字是所有关原创 2017-04-28 12:36:13 · 333 阅读 · 0 评论 -
用manacher算法求最长回文子串
好不容易看懂这个算法,赶紧记下来。。。 回文串就是一个不论是从前往后看还是从后往前看都是一样的一个字符串。在求回文串的时候难免会有因为串的长度为奇数还是偶数来分情况讨论,manacher算法为了避免这个问题,在字符串的前端和尾部以及中间位置都插入一个与该字符串无关的一个字符。例如字符串ababab,经过处理就会得到#a#b#a#b#a#b#,这样不管这个字符串在开始时为奇数还是偶数,经过处理都会变原创 2017-05-05 22:05:19 · 266 阅读 · 0 评论 -
回文数的判断
其实是很简单的一个东西,只不过觉得今天的写了之后看了别人的代码觉得挺有意思的,所以记录下来。 要求就是给一个int型的数,判断是否为回文数。 我的想法很简单,就是把这个数的每一个数字分离开放到一个数组,然后循环跑一遍判断是不是回文就好了。原创 2017-05-07 21:16:59 · 480 阅读 · 0 评论 -
重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。说起来一直以来并不是不会由前序遍历、中序遍历推出二叉树,但是一直以来都是死推,并没有从中找什么规律。今天看到这个题了,才发现其中的规律。前序的一个节点一定是根节点,然原创 2017-05-26 20:53:33 · 353 阅读 · 0 评论 -
按层遍历二叉树
有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。 给定二叉树的根结点root,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素按照从左往右排列。保证结点数小于等于500。具体要求如图所示: /*struct TreeNode { int val; struct TreeNode *left; struct Tre原创 2017-05-31 20:54:11 · 768 阅读 · 0 评论 -
二分查找合集
在刷题时经常会用到二分,虽然每次磕磕绊绊的也都能写出来,可是也没去做个总结。今天又遇到了,我就做个总结吧。 在一个有序数组中,查找一个值为key的数,返回它的下标,若存在多个返回任意一个即可,若不存在就返回-1;int binary_search(vectorint> a, int key){ int len = a.size(); int left = 0, rig原创 2018-01-11 21:53:10 · 320 阅读 · 0 评论 -
二叉树的深度
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。这个题目的话其实思路很好想到,我们如果按层遍历二叉树,那么二叉树的高度就等于层数;想到这里的话,这道题也就不难了。按层的话容易想到广搜的解法,把节点放到队列中,可是那样我们没办法记录层数,所以我们每次在从队列中弹出时先数下此时队列中的个数,对应的就是该层的个数,这时我们就可以原创 2018-01-16 20:14:42 · 274 阅读 · 0 评论