自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(52)
  • 收藏
  • 关注

原创 每日一题之由前序遍历和中序遍历重建二叉树

前序遍历和中序遍历的重建二叉树:首先构建二叉树的节点:struct TreeNode{ int _value; TreeNode* _left; TreeNode* _right;};分析:在二叉树的前序遍历中,第一个数字总是树的根节点的值,但在中序遍历的序列中,根节点的值在序列的中间,左子输的节点位于根节点的左侧,右子树的节点位于根节点的右侧。所以我们需要扫描一遍中序遍历才

2017-07-29 16:05:53 336

原创 每日一题之判断一个节点是否在一棵二叉树中

判断一个节点是否在一颗二叉树中:

2017-07-29 14:00:15 671

原创 每日一题之实现二叉树的前序/中序/后序非递归遍历

如图所示:前序遍历:先访问根节点,再访问左子树,最后访问右子树,上图所示的前序遍历是:8,6,5,7,10,9,11.中序遍历:先访问左子树,再访问根节点,最后访问右子树,上图所示的中序遍历是:5,6,7,8,9,10,11.后序遍历:先访问左子树,再访问右子树,最后访问根节点,上图所示的后序遍历是:5,7,6,9,11,10,8.前序遍历实现的非递归代码:

2017-07-28 22:12:25 291

原创 每日一题之判断一棵二叉树是否是平衡二叉树以及求一颗二叉树的镜像

1,检查一棵树是否是平衡二叉树:首先我们应该了解什么是平衡二叉树?平衡二叉树:它的左右子树的高度差不会超过1,并且左右字树都是一颗平衡二叉树,它的实现方法有AVL,红黑树等等。首先以递归的方式来实现:#include#includeusing namespace std;struct Node//定义这棵树{ int value; Node* left; Node* ri

2017-07-28 13:51:45 241

原创 每日一题之求二叉树的高度并销毁一棵二叉树

1,求二叉树的高度:

2017-07-28 11:03:44 327

原创 每日一题之二叉树叶子节点的个数及第K层节点的个数

1,求二叉树叶子结点的个数。分析思想:(1)如果这个树为空,则没有节点,结点数为0.(2)如果这个数只有一个根节点,它的左右子树都为空,则结点数为0.(3)如果这个数有根节点并且它的左右子树不为空,则节点数等于左子树的结点数加上右子树的结点数。实现代码:#define _CRT_SECURE_NO_WARNINGS#includeusing namespace std;

2017-07-23 15:56:06 657

原创 简聊红黑树

一:红黑树的基本概念:由红黑两个色节点组成的二叉搜索树满足下面的条件就叫做红黑树:1,每个节点不是红色就是黑色。2,根节点是黑节点。3,如果有一个节点是红节点,那么它的两个子节点就肯定是黑节点。4,对于每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑节点。二:红黑树的插入我们可以分好几种情况1,(cur有可能是一个新增节点,也有可能是由于下面的操作变红)

2017-07-23 11:26:48 245

原创 模拟实现string深拷贝的两个版本

我们在http://write.blog.csdn.net/postedit/68495670博客中描述了string类的深浅拷贝问题,现在我们了解深拷贝两个版本,一个是传统写法,另一个是现代写法。1,传统写法:#includeusing namespace std;class Mystring{public: Mystring(char* str)//初始化 :_str(n

2017-07-21 15:32:12 223

原创 每日一题之二叉树的层序遍历

二叉树层序遍历的原理如图所示:实现层序遍历的代码:

2017-07-21 13:51:12 385

原创 每日一题之栈的实现

栈:在生活中的很多例子都可以用来看作是一个栈,比如数把椅子叠放成一摞就可以看作是一个栈。为了维护这一叠放形式,对该栈可行的操作只能在其顶部实施,新的椅子只能存放到最顶端,反过来,只有最顶端的椅子才能被拿走。所以我们可以知道栈中的元素都必须遵循“后进先出”原则。我们现在实现放椅子与拿椅子的过程,即入栈(push)与出栈(pop)。栈中的一些接口如图所示:实现入栈与出栈的原理如图所示:

2017-07-20 22:44:01 192

原创 每日一题之删除尾节点并从尾到头打印

1删除一个无头单链表的非尾结点2,从尾到头打印单链表。

2017-07-20 16:26:00 500

原创 每日一题之队列与栈的相互实现

用两个栈实现一个队列:我们应该知道,栈的原理是先进后出,而队列的原理是先进先出。我们通过例子来说明该队列插入和删除元素的过程。首先先插入一个元素a到stack1,这时

2017-07-18 23:02:19 157

原创 每日一题之链表的相交

判断两个链表是否相交,,若相交,求交点:

2017-07-18 16:47:13 207

原创 每日一题之判断链表是否带环

判断链表是否带环?若带环则求环的长度,若带环求环的入口点,并计算以上每个问题的时间复杂度。分析:先定义两个指针,指针p1和p2指向链表的头节点。如果链表中的环有n个节点,指针p1先在链表上移动n步,然后两个指针以相同的速度向前移动,当第二个指针指向环的入口节点的时候,第一个指针已经围绕着环兜了一圈,又回到了入口节点。如图所示,刚开始的时候p1与p2在初始化的时候指向链表的头节点,由于环

2017-07-18 16:45:03 264

原创 每日一题之合并有序链表,合并后任有序

合并两个有序链表,合并以后的链表任然有序:

2017-07-18 15:25:42 264 1

原创 每日一题之查找单链表的第K个节点

逆置/反转单链表+查找单链表的第K个节点,要求只能便利一次链表。

2017-07-17 17:53:23 343

原创 CRC校验

CRC的概念:现今的计算机网络中广泛应用的差错冗余检测编码。CRC编码也叫多项式编码,因为该编码能够将要发送的比特串看作为系数是0和1多项式,对比特串的操作被解释为多项式算式。CRC的编码操作如下:考虑d比特的数据D,发送节点要将它发送给接收节点。发送方和接收方首先必须协商一个r+1比特模式,称为生成多项式,我们将其表示成G

2017-07-11 17:32:56 483

原创 关于七大排序问题《三》

7,快速排序:快速排序与归并排序还是有

2017-07-11 17:05:17 157

原创 关于七大排序问题《二》

5冒泡排序:冒泡排序的思想是(按照升序):如果前一个数大于后一个数,那么就交换,如图所示:冒泡排序实现的实现:

2017-07-10 15:41:54 186

原创 关于七大排序问题《一》

常见的排序如图所示:首先依次来分析各个排序:一:插入排序:a,直接插入排序:插入排序一般应用于

2017-07-10 11:07:42 164

原创 linux--网络基础

协议:日常生活中,人类也是有些默认的协议,比如当你行要向一个陌生人需要询问时间的时候如图所示。对你好的典型响应是返回一个

2017-07-08 16:48:45 341

原创 线程互斥锁与死锁

(1)首先来了解线程的同步与互斥:当多个线程访问同一个进程时的临界区时需要被同步与互斥保护避免产生冲突。比如当两个线程都要把某个全局变量增加1,这个操作在某平台上需要三条指令完成:1,从内存读变量到寄存器。2,寄存器的值加1。3,将寄存器的值写回内存。来看这个程序: #include 2 #include 3 #define NLOOP 5000 4 5 int co

2017-06-17 15:00:17 486

原创 二叉树——AVL

AVL二叉树的基本概念:AVL树又称为高度平衡的二叉搜索树,他既能保持二叉树的高度平衡,尽量降低二叉树的高度,又能减少树的平均搜索长度。AVL树的性质:1,左子树和右子树的高度之差的绝对值不超过一。2,树中的每个左子树和右子树都是AVL树。3,每个节点都有一个平衡因子,每个平衡因子的值等于右子树的高度减去左子树的高度并且平衡因子的值只能有三个值:1,-1,0。我们以数组

2017-06-16 17:55:57 439

原创 进程间通信——消息队列

(1)消息队列的基本概念:消息队列可以简单理解为双向链表。消息队列提供了一种从进程向另一个进程发送一个数据的方法,在读或写数据时,要根据数据的大小全部读写。管道是基于字节流的,而消息队列是基于消息。每个数据块都被认为是有一个类型,接收者进程接受的书记可以有不同的类型值。我们可以通过发送消息来避免命名管道的同步和阻塞问题。每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有

2017-06-14 15:40:54 239

原创 进程间通信---信号量

信号量的本质是一种数据操作锁,它的本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识。信号在此过程中负责数据操作的互斥,同步等功能。

2017-06-10 17:35:38 245

原创 线程的基本概念

一:线程的基本知识首先我们应该知道线程是在进程内部运行的,所谓的内部运行是在地址空间内运行;线程是进程的一个分支,但是没有专门的结构体来描述线程,所以没有真正意义上的线程,他的实现是通过进程来模拟实现(以共享地址空间来模拟)。Linux下识别到的PCB都可以看作是轻量级进程。进程承担分配基本资源的基本实体,具有独立性;线程是CPU调度的基本单位,线程会产生各种临时变量保存到栈当中,每个线程

2017-06-09 15:15:41 220

原创 进程之间的通信———管道

进程之间的通信的本质是让不同的进程看到一份公共的资源(有内核提供)

2017-06-09 10:43:23 417

原创 二叉树--堆

对数据结构是一种数组对象,它可以被视为一颗完全二叉树结构

2017-06-02 23:10:01 162

原创 进程的基本概念以及如何创建子进程

进程是一种动态描述,但是并不代表所有的进程都在运行。进程有两个基本元素,一个是程序代码(可能被执行相同程序的其他程序共享)和代码相关联的数据集。任何计算机都包含一个基本的程序集合,称为操作系统(它的上层是shell),它的目的:往下,与硬件交互,管理所有的硬件资源;往上,为用户程序提供一个良好的执行环境。我们应该知道程序是一个二进制文件,它存在与硬盘,当它运行的时候就有了动态的属性,此时有

2017-06-01 10:09:18 2358

原创 时间复杂度与空间复杂度的基本概念

时间复杂度:时间复杂度是指计算函数执行的基本次数,这里所指的函数是指数学里面的函数。计算时间复杂度的时候一般会采用取大舍小的方法,比如时间复杂度=N^2+10,我们就会舍去10一个函数的算法我们也分好几种情况,而我们一般都是考虑最坏的情况。最好情况:输入的次数是函数运行的最小运行时间。最坏情况:输入的次数是函数的最大运行时间。平均情况:输入的次数是函数运行次数期望的运行时间

2017-05-25 11:19:25 1223

原创 智能指针

智能指针其实是一种类,体系。智能指针不等同于RAII。智能指针是RAII的一种应用,智能管理释放,能够像指针一样使用。正常赋值拷贝(解决多个智能指针对象管理同一块资源释放多次的问题)。首先来看C++早期智能指针auto_ptr的模拟实现:#includeusing namespace std;templateclass Auto_ptr{public: Auto_ptr(T*

2017-05-20 09:37:46 129

原创 (一)STL之list

首先我们了解STL的基本概念:STL不仅仅是一个可复用的组件库,而且是一个包含算法和数据结构的软件框架STL有六大组件:1,容器---各种数据结构(vector,list,map,set)2,迭代器---扮演容器和算法的胶合剂3,空间分配器---负责内存空间的分配与管理4,配接器---一种修饰容器或者仿函数或者迭代器接口的东西5,算法---各种常见算法(sort,searc

2017-05-19 08:11:40 132

原创 关于异常

异常的概念:      是当一个函数发现自己无法处理的错误时抛出异常,让函数的调用者直接或者间接的处理这个问题。关于异常的引入程序:#define _CRT_SECURE_NO_WARNINGS#include#includeusing namespace std;class Exception{public: Exception(int id, const char*

2017-05-13 11:22:18 170

原创 判断支不支持分离编译

为什么模板不支持分离编译?什么时候会出现连接错误?如果是普通函数在一个.cpp文件中申明,在另外一个.cpp文件中定义时,是可以编译且链接的,但是当不存在定义时,会出现连接错误。我们具体来分析这类的问题吧:一个程序写好之后运行的话会有4个步骤,分别是,预处理,编译,汇编,链接。

2017-05-10 18:05:09 162

原创 模板的特化和萃取

模板的特化可以分为全特化和偏特化。首先来看模板全特化的例子:#includeusing namespace std;template class Seqlist{public: Seqlist() { cout ->memcpy" << endl; }};template<>class Seqlist{public: Seqlist() { cout

2017-05-10 17:53:47 309

原创 覆盖

#includeusing namespace std;class A{protected: int m_data;public: A(int data = 0) { m_data = data; } int GetData() { return doGetData(); } virtual int doGetData() { return

2017-04-23 14:27:29 142

原创 模板《一》

首先知道,模板函数不是一个函数,它只是实现具体函数的工具。我们举一个简单的例子,写一个加法函数:#includeusing namespace std;int Add(int left, int right){ return left + right;}char Add(char left, char right){ return left + right;}int mai

2017-04-15 09:48:14 287

原创 多态

多态简单说就是多种形态。多态可以分为静态多态和动态多态。静态多态是在编译期间完成的,编译器会根据函数实参的类型,可以推断出想要调用的那个函数,要是没有能够调用的函数,那么编译就会出错。比如:#includeusing namespace std;int ADD(int i, int j){ return i + j;}double ADD(double i, double j)

2017-04-06 11:30:07 156

原创 继承《二》

在上篇博客继承《一》中我们所了解的继承全部都是单继承,而我们现在来看继承的其他种类。一:多继承:那什么是多继承?我们把一个派生类有两个或者有两个以上的基类的继承称之为多继承。举一个例子:#includeusing namespace std;class B1{public: int _b1;};class B2{public: int _b2;};cl

2017-04-06 11:22:26 301

原创 继承《一》

继承的概念:    继承是面向对象程序设计使代码可以复用的最重要的手段,它容许程序员在保持原有类型特性的基础上进行扩展,增加功能。这样产生的类叫新生的类,叫派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知程度。   继承的定义格式:他们在内存中的布局如图所示:说明他们有两个作用域而继承方式有三种,分别是:public(公有继承),protect

2017-04-04 22:35:07 221

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除