自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 链表问题_两个链表的第一个公共节点

题目:输入两个链表,找出它们的第一个公共结点 分析:对于这个问题有三种思路: 1、蛮力算法,当遍历到一个节点时,就在另外一个链表上顺序遍历,并且判断是否相等,如果想等就是第一个重合的节点,对于两个长度分别为m和n的链表,所需要的时间为O(m*n)。实现如下: struct ListNode { int val; struct ListNode *next;...

2018-06-29 15:55:08 268 1

原创 链表问题_复杂链表的复制

题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空...

2018-06-29 14:54:49 197

原创 链表问题_合并两个排序链表

题目:输入两个递增排序的链表,合并这两个排序链表,使得合并之后的链表仍然使递增排序的。 分析:即是归并排序中的归并操作,有两种具体的实现:1、使用递归的方法,2、迭代版本,逐个合并链表。实现如下:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : va...

2018-06-27 19:31:17 130

原创 链表问题_反转链表

题目:输入一个链表的头结点,翻转该链表之后输出头结点。 分析:翻转一个链表即翻转其连接方向,定义三个指针,pnode表示当前遍历到的节点;p_pre为pnode的前驱,p_succ为pnode的后继,之前的连接方向为p_pre->pnode->p_succ,将其改为p_pre<-pnode<-p_succ即可,在实现的过程中要注意代码的鲁棒性。实现如下: Lis...

2018-06-27 17:06:50 136

原创 链表问题_链表中倒数第K个节点

题目:输入一个链表,输出该链表中倒数第k个节点。尾节点为倒数第一个节点。 分析:可以采用两个指针,记为start和end,先让end在链表上走k-1步,然后两个节点同时开始走,当end到达尾节点时,start即为倒数第k个节点。这相当于做了一个长度为k的标尺一样,虽然很简单,但是在涉及到指针的操作时,一定要注意代码的鲁棒性,具体如下:/*struct ListNode { in...

2018-06-27 16:27:47 166

原创 链表问题_在O(1)时间内删除链表节点

题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该结点。 分析:对于删除单向链表中的节点,通常的思路:删除节点I之前,先从链表的头结点开始遍历到I前面的一个节点h,把h的next节点指向I的下一个节点j,再删除节点I,但是这样做的复杂度为O(n)。这里采用另外一种思路,把节点j的内容复制覆盖节点I,接下来再把节点I的next指向j的下一个节点,之后再删除节点j。...

2018-06-27 15:53:33 285

原创 链表问题_从尾到头打印链表

题目:输入一个链表的头节点,从尾到头打印链表。 分析:有两种思路,1、借助栈,从头到尾遍历链表将值存入栈中,然后输出栈中的值即可。2、可以使用递归,递归的本质就是一个栈结构,但是当链表很长的时候,会导致函数调用的层级很深,从而导致函数调用栈溢出,这里仅给出解法。/*解法1*//*** struct ListNode {* int val;* stru...

2018-06-27 15:02:22 122

原创 数据结构_kd-树

kd-树一维范围查询 如下图所示,许多实际应用问题,都可归结为如下形式的查询:给定直线L上的点集P={P0,….,Pn-1},对于任一区间R=[x1,x2],P中哪些点落在其中。 上述这种查找问题统称为一维范围查询,对于这种问题的解决方法,我们通常有以下几种方法解决: 1、蛮力算法 可以直接遍历点集P,并且逐个的花费O(1)时间判断各点是否落在区间R内,这样总体的运行时间为O(n)...

2018-06-26 15:38:53 491

原创 数据结构_红黑树

红黑树红黑树也是属于一种BBST。在之前介绍的伸展树中,虽然实现简单,分摊复杂度低,但是最坏情况下的操作需要O(n)时间,无法适用于对单次效率敏感的场合。相反的,之前介绍的AVL树尽管可以保证最坏情况下的单次操作,但是要在节点中嵌入平衡因子等标识;更重要的是,删除操作之后可能需要多达O(logn)次旋转。红黑树是针对后一不足的改进。通过为节点指定颜色,合理动态调整。它可以保证:在每一次插入或删...

2018-06-25 20:58:52 902

原创 数据结构_B-树

B-树从严格意义上讲B-数并不是二分查找树,在物理上B-树的每个节点可以包含多个分支,但是从逻辑上讲,它等同于二分查找树。为了了解B-树,首先要了解以下几个方面的内容。1、越来越小的内存 事实上:内存容量的增长速度时要远远小于问题数据规模的增长速度,例如: 典型的数据库规模 / 内存容量 1980:10MB / 1MB = 10 2000:1TB / 1GB =...

2018-06-25 14:40:23 1714

原创 数据结构_平衡二叉搜索树(伸展树 splay tree)

splay tree与之前介绍的AVL树一样,伸展树也是平衡二叉搜索树的一种形式。首先,鉴于数据访问的局部性在实际应用中普遍存在,将按照“最常用者优先”的启发策略,引入并且实现伸展树。尽管最坏的情况下单次操作需要O(n)时间,但其分摊意义仍然在O(log(n))以内。并且相比于AVL树,伸展树无需时刻都严格的保持全树的平衡。局部性 数据的局部性:刚刚被访问过的元素,极有可能很快地在此被...

2018-06-23 15:49:50 792

原创 数据结构_平衡二叉搜索树(AVL树)

平衡二叉搜索树在二叉搜索树中,已经知道search、insert和remove等主要接口的运行时间均正比于树的高度。但是在最坏的情况下,二叉搜索树可能退化成列表,此时查找的效率会降至O(n)。因此,通常通过控制树高,来控制最坏情况下的时间复杂度。 对于节点数目固定的BST,越是平衡,最坏情况下的查找速度越快,如下图所示: 为了理解平衡二叉树,我们首先要理解几个主要概念,理想平衡与适度平...

2018-06-21 21:22:36 8675

原创 数据结构_二叉搜索树

二叉搜索树 所谓的查找,指从一组数据对象中找出符合特定条件者。其中的数据对象,统一的表示和实现为词条(entry)的形式;不同的数据项之间,依照各自的关键码(key)彼此区分。 一般而言词条应以如下形式: template <typename K, typename V> struct Entry { //词条模板类 K key; V value; //关键码、数值...

2018-06-21 10:46:12 460

原创 数据结构_二叉树的遍历

二叉树的遍历树的遍历即是:按照某种次序访问树中各个节点,并且每个节点恰好被访问一次。 遍历的方式有以下几种: 先序:V | L | R 中序:L | V | R 后序:L | R | V 层次/广度优先:自上而下,先左后右。先序遍历 递归版本:/*struct TreeNode { int val; struct TreeNode *left; ...

2018-06-20 15:49:46 523

原创 数据结构_树的定义及存储结构

树树的特点:不是简单的线性结构,但在确定某种次序之后,具有线性特征。对于树,它集成vector和list的优点,既可以快速插入、删除也可以快速查找。 递归定义 树是特殊的图T=(V,E),节点数|V|=n ,边数|E|=e。指定任一节点r属于V作为根后,T即称作有根树。 如: 若指定r=root(T),则 1、称ri 为 r 的孩子;称 r 为 ri 的父亲;r1, r2, ...

2018-06-19 16:36:27 932

原创 二叉树应用_二叉搜索树的第K个节点

题目:给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。 分析:进行中序遍历,中序遍历序列的数值是递增排序的。 /*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;...

2018-06-15 16:15:46 352

原创 二叉树应用_序列化二叉树

题目:实现两个函数,实现序列化和反序列化二叉树。 分析:我们可以从前序遍历和中序遍历序列构造出一个二叉树。我们可以先把一颗二叉树序列化成一个前序遍历序列和一个中序遍历序列,然后进行构造。但是这个思路有两个缺点,一个是要求两个序列中所有数据都读出后才能开始反序列化,另外要求不能有数值重复的节点。 我们可以根据前序遍历的顺序来序列化二叉树,前序遍历是从根节点开始的。当在遍历二叉树碰到NULL指针时...

2018-06-15 10:59:05 123

原创 二叉树应用_二叉树的下一个节点

题目:给定一个二叉树和其中的一个节点,找出中序遍历的下一个节点。树中的节点除了有指向左右节点的两个指针之外,还有一个指向父节点的指针。 分析:对于这个问题分情况讨论,1、如果一个节点有右子树,那么它中序遍历的下一个节点就是它的右子树的最左子节点。2、如果一个节点没有右子树,并且是他父节点的左子节点,那么他的父节点就是中序遍历中的下一个节点。3、如果一个节点既没有右子树,并且他还是父节点的右子节点...

2018-06-14 16:23:26 271

原创 二叉树应用_树中两个节点的最低公共祖先

题目:给定树中的两个节点,找出这两个节点的最低公共祖先。情况1:当给定的树为二叉搜索树时。 分析:由于二叉搜索树是排序过的,位于左子树的节点都小于根节点,位于右子树的节点都大于根节点。如果要查找的两个节点比根节点大的话,则最低公共祖先在右子树中;如果要查找的两个节点比根节点小的话,则最低公共祖先在左子树中。/*struct TreeNode { int val; s...

2018-06-14 15:53:41 409

原创 二叉树应用_二叉树深度

题目:输入一颗二叉树的根节点,求该树的深度。 分析:方法一:在二叉树中和为某一值的路径中已经知道了如何存取树的一条路径,这里我们可以用此方法求出树的最长路径,也就是树的深度。方法二:树的深度即是左、右子树中深度较大的值加1,可以采用此方法进行递归。 方法一实现如下:/*struct TreeNode { int val; struct TreeNode *left; ...

2018-06-14 11:28:59 173

原创 二叉树应用_二叉搜索树与双向链表

题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点的指向。 分析:由于要求转换之后的链表是排好序的,我们采用中序遍历,遍历树中的每一个节点。根节点、左子树和右子树。在把左、右子树都转换成双向链表之后再和根节点连接起来,整颗二叉树就转换成了排序好的双向链表。 实现如下:/*struct TreeNode { int va...

2018-06-13 17:16:01 112

原创 二叉树应用_二叉树中和为某一值的路径

题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根节点往下一直到叶节点所经过的结点形成一条路径。 分析:在二叉树的前序、中序、后序三种遍历方式中只有前序遍历先访问的是根节点。因此采用前序遍历的方式遍历树,当遍历到某一个节点时,我们把该结点添加到路径上,并且累加结点的值。并且,如果该结点为叶节点且累加的和刚好为输入的整数,则当前路劲符合要求,我们把它打印出来。如...

2018-06-13 16:42:44 145

原创 二叉树应用_二叉搜索树的后续遍历序列

题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历序列的结果。假设输入的数组的任意两个数字都互不相同。 分析:在二叉搜索树的后序遍历中,根节点在最后面。前面的序列可以分为两个部分:一个为左子树,小于根节点的值;一个为右子树,大于根节点的值。左子树序列和右子树序列同样应该为后序遍历序列,则可以通过递归判断是否满足。 具体实现:bool VerifySquenceOfBST(v...

2018-06-13 16:03:45 122

原创 二叉树应用_打印二叉树

题目:从上往下打印二叉树的每个节点,同一层的节点按照从左往右的顺序打印。 分析:每次打印一个节点的时候,如果该节点有子节点,就把该节点的子节点放到一个队列的末尾。每次打印队列头部的节点。直到队列中的所有节点都被打印出来为止。 实现如下:/*struct TreeNode { int val; struct TreeNode *left; struct Tree...

2018-06-13 15:24:41 251

原创 二叉树应用_二叉树镜像(对称)

题目:完成一个函数,输入一个二叉树,该函数输出它的镜像。 如: 分析:对于一个二叉树的镜像过程,我们可以先前序遍历这棵树的每一个节点,如果遍历到的节点有子节点,就交换它的两个子节点。当交换完所有的飞叶子节点之后,就得到了树的镜像。 具体实现:/*struct TreeNode { int val; struct TreeNode *left; struc...

2018-06-13 13:48:23 386

原创 二叉树应用_树的子结构

题目: 输入两棵二叉树A和B,判断B是不是A的子结构(空树不是任一树的子结构)。分析:要想查找树A中是否存在和树B一样的结构,我们可以分成两步: 1、在树A中找到和树B的根节点一样的节点R 2、在判断树A中以R为根节点的树中是不是包含和树B一样的结构。 具体实现如下:/*struct TreeNode { int val; struct TreeNode *left...

2018-06-13 13:32:41 129

原创 二叉树应用_重建二叉树

题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 分析:二叉树的前序遍历为:根、左、右。所以对应的第一个节点就为根节点。确定根节点之后,扫描中序遍历序列,找到对应的根节点,即可根据中序遍历的特点(左、...

2018-06-13 12:58:46 142

原创 C++常见问题总结_拷贝控制(对象移动)

拷贝控制(对象移动)一个类通过定义五种特殊的成员函数来控制这些操作,包括:拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符和析构函数。在C++常见问题总结_拷贝控制(拷贝、赋值、销毁)一文中已经介绍了拷贝构造函数、拷贝赋值运算符和析构函数。在本篇文章中将介绍移动构造函数和移动赋值运算符。 新标准一个主要的特性就是可以移动对象而非拷贝对象的能力。在C++常见问题总结_动态内存管理类中...

2018-06-11 16:31:50 973

原创 C++常见问题总结_动态内存管理类

某些类需要在运行时分配可变大小的内存空间,通常这种类可以使用标准库容器来保存他们的数据。但是这一策略并不是对所有的类都管用,某些类需要自己进行内存分配,这些类一般需要自己定义自己的拷贝控制成员来管理所分配的内存。 这一篇文章将实现vector类的一个简化版本,不采用模板,只适用于string。将其命名为StrVec。 StrVec类:#pragma once#define _SCL_S...

2018-06-08 19:11:08 336

原创 拷贝控制示例

在本片文章中,我们将概述两个类的设计,这两个类可以用于邮件处理应用中。(消息处理示例) 提供两个类名Message和Folder,分别表示一种类型的消息和消息目录。每个Message对象可以出现在多个Folder中。但是任意给定的Message的内容只有一个副本。这样,如果一条Message的内容被改变,则我们从他所在的任何Folder来浏览此Message时,都会看到改变后的内容。 为了记录...

2018-06-08 14:37:32 274

原创 C++常见问题总结_拷贝控制和资源管理

通常,管理类外资源的类必须定义拷贝控制成员。为了定义这些成员,我们首先必须确定此类型对象的拷贝语义。一般有两种选择:使类的行为看起来像一个值或者像一个指针。行为像值的类 类的行为像一个值,意味着它应该有自己的状态。当我们拷贝一个像值的对象时,副本和源对象是完全独立的。改变副本不会对原对象有任何影响。如标准库类型中string 1、定义一个类值行为的类#include<iostre...

2018-06-07 20:18:00 363

原创 C++常见问题总结_拷贝控制(拷贝、赋值、销毁)

当我们定义一个类时,我们显示或隐式地指定在此类型对象拷贝、赋值和销毁时做什么。 一个类通过定义五种特殊的成员函数来控制这些操作,包括:拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符和析构函数。 拷贝和移动构造函数定义了当用同类型的另一个对象初始化本对象时做什么。拷贝和移动赋值运算符定义了将一个对象赋予同类型的令一个对象时做什么,析构函数定义了当此类型对象销毁时做什么。 在本片文章...

2018-06-07 15:24:51 1295

原创 数据结构_队列及其应用

除了顺序容器外,标准库还定义了三个顺序容器适配器,stack、queue和priority_queue。本质上一个适配器是一种机制,能使某种事物的行为看起来像另外一种事物一样。一个容器适配器接收一种已有的容器类型,使其行为看起来像另外一种不同类型一样。 本文主要介绍队列及其应用,栈及其应用参考栈及其应用 ,优先级队列参考队列/*queue默认基于deque实现,也可以使用list或v...

2018-06-05 17:40:58 2114

原创 使用标准库:文本查询程序

我们将实现一个简单的文本查询程序,我们的程序允许用户在一个给定文件中查询单词。查询结果是单词在文件中出现的次数及其所在行的列表。如果一个单词在一行中出现多次,此行只列出一次。行会按照升序输出。我们可以直接使用vector 、set和map来直接编写文本查询程序,我们在这里经定义一个抽象的解决方案。首先我们将会定义一个保存输入文件的类,它包含一个vector和map。vector用来保存输入文件...

2018-06-05 15:20:21 417

转载 枚举类型enum

枚举类型的定义枚举类型(enumeration)是C++中的一种派生数据类型,它是由用户定义的若干枚举常量的集合。定义格式:枚举类型的定义格式为:    enum <类型名> {<枚举常量表>};其中:关键字enum——指明其后的标识符是一个枚举类型的名字。枚举常量表——由枚举常量构成。“枚举常量”或称“枚举成员”,是以标识符形式表...

2018-06-04 17:05:16 224

原创 数据结构_栈及其应用

站及其应用栈 栈是存放数据对象的一种特殊容器,栈中的元素始终遵循后进先出的顺序,作为一种抽象数据类型,栈支持的操作接口如下:stack<T> S;S.pop();S.top();S.push();s.empty();s.size();栈的应用逆序输出 输出次序与处理过程颠倒;递归深度和输出长度不易知道。 conversion(进制转换)v...

2018-06-04 16:14:28 15438

转载 cout格式化输出

转载于:cout格式化输出 在C语言中,我们一般用printf()函数来进行输出,通过输出字符串中的格式说明符(如%4.2d)可以很容易地格式化输出。而在C++中,为简便起见,往往不指定输出的格式,由系统根据数据的类型采取默认的格式,但有时也需要数据按我们指定的格式输出,比如以十六进制的形式输出一个整数等。有两种方法可以...

2018-06-02 17:06:08 259

空空如也

空空如也

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

TA关注的人

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