数据结构
文章平均质量分 89
lei19950206
明明是个强人,天生一副熊样。。
展开
-
关于vector list 之间区别的一点总结
1,vector先看代码:vectorv;v.push_back(1);v.push_back(1);v.push_back(3);v.push_back(4);v.push_back(5);v.push_back(6);v.push_back(7);v.push_back(8);v.push_back(9);v.push_back(10);/*原创 2017-05-05 15:51:45 · 1199 阅读 · 0 评论 -
数据结构】AVL树
AVL树,是一棵平衡搜索二叉树,既满足搜索树的性质(见二叉搜索树的文章,链接:二叉搜索树),又满足平衡树的性质(左右子树的高度差不大于2)。在二叉搜索树中,我们知道要插入一个元素,必须将他插到合适的位置,但是在AVL树中,不仅要插入到合适的位置,还要保证插入该元素之后这棵树是平衡搜索二叉树。关于如何调整一棵二叉树为平衡二叉树,这里就涉及到四种旋转:左单旋,右单旋,左右双旋,右左原创 2017-06-04 23:06:56 · 382 阅读 · 0 评论 -
给出几种排序总结
1.冒泡及其稍微优化#includevoid Bubbsort(int a[],int len){ assert(a); for (int i = 0; i < len - 1; i++) { int tmp = 0;//标志状态 for (int j = 0; j < len - i - 1; j++) { if (a[j]>a[j + 1]) {原创 2017-06-01 15:32:27 · 464 阅读 · 0 评论 -
链表的实现以及合并,排序,逆序,等
1。链表的结构2,链表的初始化3,创建节点4,尾插5,头插6,查找7,头删8,移除9,合并两个有序链表,合并后依然有序Plist merge(Plist head3,Plist head4){ if (head3 == NULL) return head4; if (h原创 2017-06-06 19:07:12 · 443 阅读 · 0 评论 -
二叉树的前序创建树以及中序后序非递归实现 以及节点个数,叶子节点个数第n层节点个数,深度
#includeusing namespace std;#include#include#includetemplatestruct TreeNode{ T _data; TreeNode* _left; TreeNode* _right; TreeNode(const T&data) :_data(data) , _left(NULL) , _right(NUL原创 2017-06-03 16:32:31 · 883 阅读 · 0 评论 -
看二叉树是否是完全二叉树
首先看什么是完全二叉树先判断下面的二叉树是不是完全二叉树这里给出的思想是把所有二叉树的节点入队列,然后遇到NULL停止,看栈中剩余的是否还有空节点,若有的话则为满二叉树,没有的话则不是,可以对照代码理解思想,这里不难理解原创 2017-06-03 22:41:30 · 341 阅读 · 0 评论 -
求一棵二叉树的镜像
求一棵二叉树的镜像二叉树的镜像就是将二叉树的左右子树都交换位置得到的一棵二叉树。所以我们可以通过递归来解决。下边给出代码实现: void _Mirror(Node* root) { if(root == NULL) return; if(root->_left == NULL && root->_right ==原创 2017-06-04 11:50:40 · 390 阅读 · 0 评论 -
判断元素出栈、入栈顺序的合法性。如:入栈的序列( 1,2,3,4,5 ),出栈序列为 ( 4,5,3,2,1 )是合法序列,入栈的序列( 1,2,3,4,5 ),出栈序列为( 1,5,3,2,4 )是
这个题比较复杂一点,先给出几个例子结果选 ABD这个题直接给出代码,代码中注释一些细节bool adjudge(int *in,int *out,int len_in,int len_out){ stack s; if (in == NULL || out == NULL || len_in != len_out)//如果有空或者长度不相等直接返回错误 { return原创 2017-05-26 21:20:14 · 1065 阅读 · 0 评论 -
判断链表是否有环及环的入口
1.如何判断是否有环?如果有两个头结点指针,一个走的快,一个走的慢,那么若干步以后,快的指针总会超过慢的指针一圈。2.如何计算环的长度?第一次相遇(超一圈)时开始计数,第二次相遇时停止计数。3.如何判断环的入口点:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点、头指针开始走,相遇的那个点就是连接点。为什么呢?需要一个简单的计算过程: (1)当fast与slow相遇原创 2017-07-17 22:14:40 · 277 阅读 · 0 评论 -
快速排序
快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快速原创 2017-05-31 12:17:21 · 279 阅读 · 0 评论 -
【数据结构】二叉搜索树
二叉搜索树,又叫二叉排序树,二叉查找树。它有以下特点:左子树的值小于根节点的值,右子树的值大于根节点的值;二叉搜索树中序遍历的结果就是一个升序序列。当然,空树也是一个二叉搜索树。全局满足二叉搜索树的性质,局部也应该满足。既然有以上性质,那么二叉树的查找是相当方便的,当然插入和删除,复杂度也会明显降低。查找:从根节点开始,如果要插入的key小于根节点的key,则向左走,否原创 2017-06-04 17:24:02 · 251 阅读 · 0 评论 -
Can you use map and set???
一、map和set的引入 我们都知道,STL在C++ 中得到了广泛使用,它不仅仅由于是提供了类似vector,list等方便使用的容器,更是因为它封装了许多复杂的数据结构算法和大量数据结构的操作。vector封装数组,list封装链表,而map和set则是用来封装二叉树的。 还有要知道的就说STL中的容器分为两大类:序列式容器和关联式容器,其中vector和li原创 2017-05-30 09:31:18 · 584 阅读 · 0 评论 -
二叉树面试题
1.根据前序遍历序列和中序遍历序列求一棵二叉树。那么我们就是很容易的写出完整代码。[html] view plain copy templatetypename T> struct BinaryTreeNode { T _data; BinaryTreeNodeT>* _left;原创 2017-05-05 15:17:19 · 514 阅读 · 0 评论 -
两个栈实现一个队列
class Queue{public: void Push(int value) { if (!s2.empty()) { s1.push(s2.top()); s2.pop(); } s1.push(value); } void Pop() { if (s1.empty() && s2.empty()) return; if (!s1.em原创 2017-05-26 21:03:25 · 259 阅读 · 0 评论 -
1. 实现一个栈,要求实现 Push (出栈)、 Pop (入栈)、 Min (返回最小值的操作) 的时间复杂度为 O(1)
class achievestack{public: void push(int value) { if (s1.empty() && s2.empty()) { s1.push(value); s2.push(value); } else { if (value <= s2.top()) { s2.push(value); }原创 2017-05-26 20:33:11 · 477 阅读 · 0 评论 -
一个数组实现两个栈
#includeclass TwoStack{public: TwoStack() :size1(0) , size2(0) { v.resize(5); } void Push1(int value) { CkeckCapacity(); v.insert(v.begin()+size1,value);//vector没有头插,插入就用这种方式 size1原创 2017-05-26 21:40:06 · 325 阅读 · 0 评论 -
使用两个队列实现一个栈
此原理和两个栈模拟一个队列是一样的,可以参考思想直接给出代码class Stack{public: void Push(int value) { if (!q2.empty()) { q1.push(q2.back()); q2.pop(); } q1.push(value); } void Pop() { if (q1.empty() && q2原创 2017-05-26 21:07:23 · 276 阅读 · 0 评论 -
位图:【面试题】给40亿个无符号不重复且没排过序的数,查找一个数是否在这40亿个数之中
看到这样一道面试题,我们不由的想到前边学习过的哈希表,哈希表查找效率高,唯独就是 空间浪费有点大。而在这道题目之中,40亿个无符号数(表明最高位表示大小),几乎涵盖了整形里的所有的数(总共42亿9千多)。而42亿9千多的数全部放到内存大约需要4G*4 = 16G,加上操作系统,各种运行软件,我们普通的计算机是无法运行这42亿数字的,除非超级计算机。所以,按照将每个数字都占用一个整形空间的方式导入内原创 2017-05-09 20:32:48 · 1479 阅读 · 0 评论 -
堆及topk问题
堆的本质vector+向下调整算法/向上调整算法。 注意:这个二叉树为完全二叉树向下调整算法:已知条件:从一个节点开始向下调整,已知这个节点的左右子树已经是大堆或小堆。 所以需要从第一个不是叶子节点的节点开始调整,而这个节点正好是最后一个节点的父节点。 i = (_v.size() - 2)>>1; i即是最后一个不是叶子节点的节点。以小堆为例:原创 2017-05-19 00:11:28 · 382 阅读 · 0 评论 -
找出两个链表的第一个公共结点
题目:两个单向链表,找出它们的第一个公共结点。链表的结点定义为:struct ListNode{int m_nKey;ListNode* m_pNext;};分析:这是一道微软的面试题。微软非常喜欢与链表相关的题目,因此在微软的面试题中,链表出现的概率相当高。如果两个单向链表有公共的结点,也就是说两个链表从某一结点开始,它们的m_pN原创 2017-07-18 10:32:38 · 380 阅读 · 0 评论