
数据结构
文章平均质量分 65
小葱1024
耐得住寂寞才能守得住繁华,在该奋斗的年纪不要选择了安逸,
坚持梦想,无畏风雨
展开
-
单链表的基本操作-----图形解析
首先我们需要思考的是为什么需要单链表呢? 单链表和顺序表相比较,又有什么优点呢? 在顺序表中,当我们需要头插,或者在顺序表的中间位置插入元素时,就必须将后面的元素一一后移,再将需要插入的元素插入进去。 可是这样的效率明显较低,所以我们就想到了单链表这种结构,可以将在物理地址上不连续的数据连接起来,需要连接,那么就需要有一个保存下一个元素地址的指针,想了想后,发现没有这样的内置类型可原创 2016-12-31 01:12:28 · 14708 阅读 · 2 评论 -
线索化二叉树
中序线索化(递归):图形解析:代码如下://中序线索化 void InorderThreading() { Node* prev = NULL; _InoderThreading(_root, prev); }void _InoderThreading(Node* cur, Node* & prev) { if (cur)原创 2017-05-27 00:25:53 · 393 阅读 · 0 评论 -
堆及topk问题
堆的本质 vector+向下调整算法/向上调整算法。 注意:这个二叉树为完全二叉树向下调整算法: 已知条件:从一个节点开始向下调整,已知这个节点的左右子树已经是大堆或小堆。 所以需要从第一个不是叶子节点的节点开始调整,而这个节点正好是最后一个节点的父节点。 i = (_v.size() - 2)>>1; i即是最后一个不是叶子节点的节点。以小堆为例:1.以删除堆顶元素为原创 2017-05-17 17:55:16 · 526 阅读 · 0 评论 -
二叉搜索树
特点:二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree) 一般具有下面的特点:若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;任意节点的左、右子树也分别为二叉查找树。没有键值相等的节点(no d原创 2017-05-26 08:12:11 · 245 阅读 · 0 评论 -
AVLTree的各种旋转问题图解分析
AVL树(严格平衡二叉搜索树)的特性:①左子树和右子树的高度之差的绝对值不超过1 ②树中的每个节点的左子树和右子树都是AVL树 ③每个节点都有一个平衡因子(但不是必须的,只是方便我们操作AVL树),每个节点的平衡因子的取值范围只可能是-1,0,1.当在AVLTree中插入或者删除一个节点后会发现:破坏了AVL树的平衡,所以需要更新平衡因子以及需要进行某种旋转。单旋:双旋:左右双旋:右左双旋:代码原创 2017-06-07 12:40:20 · 1412 阅读 · 0 评论 -
RBTree的插入算法
红黑树:红黑树是一颗二叉搜索树,但是它在每个节点上都增加了一个存储位来表示节点的颜色,这个颜色非RED 即BLACK。 红黑树保证最长路径不超过最短路径的2倍,因而近似于平衡。红黑树是满足下面红黑树性质的二叉搜索树 1. 每个节点,不是红色就是黑色 2. 根节点是黑色的 3. 如果一个节点是红色的,则它的两个子节点是黑色的。(意思就是没有连续的两个红节点)。 4. 对于每个节点,从原创 2017-06-07 13:10:14 · 543 阅读 · 0 评论 -
栈和队列的面试题
1.实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)对于这个问题,我们都知道,栈的入栈和出栈时间复杂度都是O(1),那么我们所面临的问题就是需要有一个接口来实现返回最小值的操作,且这个操作的时间复杂度必须是O(1)。 这里有两种思路可供选择: (1)前提:这里有一组数据,利用一个栈,将这些数据需要入栈,而在入栈的时候遵循这样的规律,将一个数据原创 2017-07-13 11:31:05 · 1098 阅读 · 0 评论 -
判断两个链表是否相交?若相交,求交点(假设链表带环)
前言: 深知自己对于这个知识点掌握的不是很好,故好好思考,并记录下思考后的成果。图示链表带环相交问题:既然已经分析清楚,那么代码就很好实现了。。。Node* IsHaveCrossNode(Node* head1,Node* head2) { assert(head1); assert(head2); Node* meetNode1 = Is原创 2017-07-19 00:43:30 · 956 阅读 · 1 评论 -
二叉树的面试题
1. 求两个节点的最近公共祖先节点假设现在找的是节点X1和X2的最近的公共祖先节点。 这里由于这棵树的结构或者说是特点从而导致这颗树的解法会有多种思路:第一种就是这棵二叉树是一个搜索二叉树,那么可以根据搜索二叉树的特点从而找出两个节点的最近的公共祖先节点。 可以想到,如果X1在一个节点的左子树,X2在一个节点的右子树,或者X1在一个节点的右子树,而X2在一个节点的左子树,这样就可以原创 2017-07-14 20:16:44 · 1206 阅读 · 0 评论 -
文本文件和二进制文件详解(转)
转自:http://www.cnblogs.com/pengwangguoyh/articles/3223072.html前言:1)文本文件:这类文件以文本的ASCII码形式存储在计算机中。它是以”行”为基本结构的一种信息组织和存储方式。 2)二进制文件:这类文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们,只有通过相应的软件才能将其显示出来。二进制文件一般是可执行程序、图形、图像转载 2017-05-26 22:19:38 · 3678 阅读 · 0 评论 -
对称矩阵及稀疏矩阵浅谈
1.对称矩阵特点: 关于对角线对称,Aij == Aji。 下面实现: ①对称矩阵的压缩存储 ②对称矩阵的访问 ③对称矩阵的还原实现代码如下:#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;//对称矩阵的压缩存储template<class T>class SymmetricMatrix原创 2017-05-07 00:28:52 · 3068 阅读 · 0 评论 -
迷宫及走迷宫时的最优解
1.递归走迷宫: (利用回溯法)#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;#include<cassert>struct Pos//设置坐标{ Pos(int x, int y) :_x(x) , _y(y) {} int _x; int _y;原创 2017-05-07 01:03:01 · 3003 阅读 · 0 评论 -
单链表的面试题总结--------图形解析
1.// 删除无头单链表的非尾结点,要求:不能遍历单链表因为没有头结点,所以不能用固有的思维去考虑这个问题,因为是单链表,所以不能由链表中的后一个节点去找前一个节点, 所以这时需要转化一种思维,不能删除一个节点的前一个节点,但是可以去删除一个节点的后一个节点, 首先应该判断pos是否为空,如果为空,直接返回,如果不为空,分析如图示(利用转换思想)在这里还应该思考:为什么是删除非尾节点?—-如果原创 2017-01-02 00:57:42 · 704 阅读 · 0 评论 -
模拟实现vector
vector.h#pragma once#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;//vector的插入和删除都存在迭代器失效的问题,解决方法将插入和删除的函数//的参数给成引用,可以达到如下结果:当上述两个函数内部迭代器失效,也会使得//外部的迭代器也同样失效,那么就要在函数内部将其重置原创 2017-04-28 19:12:38 · 577 阅读 · 2 评论 -
模拟实现list(iterator)
说明:list的erase存在迭代器失效问题,本文给出两种解决方法,其中的一种是stl中给出的解决方法。 //List.h#pragma once#define _CRT_SECURuE_NO_WARNINGS 1#include<iostream>using namespace std;#include<cassert>//nodetemplate<class T>struct Li原创 2017-04-28 19:18:00 · 538 阅读 · 0 评论 -
栈的基本操作及如何判断一个表达式中的左右括号是否匹配
我们都知道,栈(stack)具有后进先出的特点,所以在我们思考一个表达式中的左右括号是否匹配问题时,就自然会想到是不是可以利用栈的特点来判断左右括号是否匹配呢?主要思路如下: 1.扫描整个表达式; 2.判断当前字符是否为括号(左右括号) ①如果不是,则继续扫描下一个字符; ②如果是,则判断当前操作符是否为左括号 若为左括号—>直接入栈。原创 2017-04-21 12:25:10 · 18199 阅读 · 0 评论 -
表达式求值(中缀转后缀及后缀表达式求值)
。中缀表达式转后缀表达式:中缀表达式转后缀表达式遵循以下原则: 1.遇到操作数,直接输出; 2.栈为空时,遇到运算符,入栈; 3.遇到左括号,将其入栈; 4.遇到右括号,执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出; 5.遇到其他运算符’+”-”*”/’时,弹出所有优先级大于或等于该运原创 2017-04-21 13:05:59 · 30146 阅读 · 6 评论 -
时间复杂度和空间复杂度
一开始接触数据结构,不可避免的要了解如何计算一个算法的时间复杂度和空间复杂度,也许你之前听过,但是并没有深入了解的话,那么就可以和我一起来了解下哦。。。本篇文章讲的主要内容: 1.时间复杂度 2.空间复杂度 3.两个小例子来深入理解(使用递归或非递归时的)时间复杂度和空间复杂度。 如何衡量一个算法的好与坏?算法的时间复杂度和空间复杂度统称为算法的复杂度。 空间复杂度是指当前问题的规模原创 2017-04-11 14:49:36 · 3738 阅读 · 0 评论 -
递归算法总结
下面总结一些常见的递归编程题: 1.使用递归逆序打印单链表:#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;struct Node{ Node(int data) :_data(data) , _next(NULL) {} int _data; Nod原创 2017-04-21 14:29:18 · 488 阅读 · 0 评论 -
二叉树的基本操作
1。二叉树的特点:二叉树的特点: 1.每个节点最多有两棵子树,即二叉树中不存在度大于2的节点(分支数最大不超过2) 2.二叉树的子树有左右之分,也就是说二叉树是有序的。2。二叉树的基本操作(递归):以下面的二叉树为例:1.求二叉树的节点个数: 思路: (1)root 为空(整个二叉树的根节点为空) return 0; (2)root不为空 —>左子树的节点个数 + 右子树的节点原创 2017-05-07 00:08:02 · 1201 阅读 · 0 评论 -
排序小结
概要: 了解排序算法各种算法的时间复杂度和空间复杂度如下: 排序详解:一、 插入排序直接插入排序:将一段无序区间插入到一段有序区间(1个元素自称一个区间),每次都是取出无序区间的第一个元素插入到有序区间(在有序区间找合适自己的位置,也就是保持有序区间依然有序)。图示直接插入过程:代码如下://假设是升序template<class T>void InsertSort(T* arr,size原创 2017-07-25 15:07:34 · 650 阅读 · 1 评论