自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 二叉树面试题

1.二叉树的前序,中序,后序遍历//前序遍历非递归void PrevOrder(BinaryTreeNode* root){ stack s; BinaryTreeNode* cur=root; while(cur||!s.empty()) { while(cur) { cout_data<<" "; s.push(cur); cur=cur->_left

2017-07-30 14:48:56 215

原创 插入排序

InsertSort:(以升序为例)插入排序的基本思想是:    每次将一个待排的记录,按照其关键字的大小,插入到前面已经排好序的有序区中适当的位置,直到全部记录插入完毕为止。    假设待排序的记录存放在数组R[0..n]中,初始时R[0]是一个有序区,R[1..n]是无序区,从i=1开始,依次将R[i]插入到有序区R[0..i-1]中,生成一个包含n个记录的有序区。

2017-07-29 20:37:24 164

转载 选择排序

选择排序的基本思想:初始时,有序区为0,每一趟在无序区中选出一个关键字最小的元素,然后与无序区第一个元素交换,然后无序区减1,有序区加1,直到记录全部排完。    直接选择排序:第一趟排序在R[0..n]中选出一个关键字最小的与R[0]交换,第二趟在R[1..n]中选择一个最小的与R[1]进行交换,以此类推直到无序区的记录只剩一个时排序完成。

2017-07-29 20:36:32 166

原创 冒泡

BubbleSort     冒泡排序是许多人接触的第一种排序方式,由于这种方式比较简单,所以大部分人也没有深入研究,所以写出的代码是这样的:[cpp] view plain copyvoid BubbleSort(int *arr, int len)  {      assert(arr);      int i = 0; 

2017-07-29 20:34:44 771

原创 希尔排序

希尔排序:  设待排序元素有n个,首先取一个整数gap例如:对{ 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }进行升序排列。具体代码实现:[cpp] view plain copyvoid ShellSort(int *a, int len)     //插入排

2017-07-29 20:30:58 181

转载 单例模式

一、什么是单例模式 有时候我们会遇到这样一种情况,一个类只能有一个对象被实例化,这时我们就可以使用单例模式了。 单例模式通过类本身来管理其唯一实例。在设计这个类的时候,让他只能创建一个实例并提供对此实例的全局访问。因此单例模式有两个最基本的条件是,确保一个类只有一个实例被创建,提供一个对实例的全局访问指针。二、常见的单例模式实现 常用的单例模式实现方法有两种,饿汉式和懒汉式。

2017-07-29 20:28:34 157

原创 并查集

在一个有N个元素的集合问题中,我们通常是让每个元素构成一个单元素的集合,然后按一定顺序将属于同一集合的元素进行合并。在此过程中要不断的查询某个元素归属于哪个集合,适合于描述这类问题的抽象数据类型我们称之为并查集。例: 已知有n个人和m对好友关系,并且这些好友关系存储在r里面,如果两个人是直接或间接的好友,则认为他们属于同一个朋友圈。  n=5,m=3,r={{1,2},{2

2017-07-26 20:50:12 151

转载 哈希

哈希表(散列表)通过将关键码映射到表中的某个位置上来存储元素,然后根据关键码来访问元素。  理想的的情况下,一次直接就能从哈希表中找到要搜索的元素。如果在元素的存储位置与它的关键码之间建立一个对应的函数关系式(散列函数),在插入时,依照这个函数所计算的 存储位置存放。在搜索时对元素的关键码按照同样的函数计算,找到这个存储位置进行读取,若关键码相同则搜索成功。  通常关键

2017-07-26 19:24:03 167

转载 huffman 文件压缩

利用huffman编码的思想对文件进行压缩,主要原理是通过huffman编码来重新表示字符,使得出现频率高的字符编码短,出现少的字符编码长。整体下来的话,所需的总的bit位是减少的。但是要注意当大部分字符出现的频率都差不多时,huffman压缩的压缩效率会很低。一、利用huffman树对文件进行压缩主要分为以下两部分:压缩:1、统计字符出现的次数

2017-07-26 18:10:08 237

原创 Huffman 树

Huffman树:又称最优二叉树,是加权路径长度最短的二叉树 由于每次都要找最小的两个数,所以用最小堆方便求解#pragma once#include#includeusing namespace std;templatestruct Less{ bool operator()(const T& l,const T& r) { return l<r; }};temp

2017-07-26 17:57:22 253

原创 堆排序

堆排序是一种效率很高的排序方法,尤其是在大量数据排序方面。1、降序序排列  例如:将{10,16,18,12,11,13,15,17,14,19}按照降序排列。首先要明白,如果要将一组数据按照降序排列,则我们要借助最小堆来实现。具体的方法如下:首先将这组数据建成最小堆:现在a[0]就是最小的元素,我们将a[0]

2017-07-25 22:29:26 128

原创 堆 求最数大最小前k个sh

用堆在海量数据中找出最大或最小的k个数,效率非常高。1、在一组数据中找出最小的k个数解题思路:    要找出最小的k个数,我们可以先用这组数据中的k个数构建一棵“最大堆”,然后再将剩下的元素与堆顶元素相比。如果大于堆顶元素,则不做处理,继续向下比较。如果小于堆顶元素,则将堆顶元素与这个元素交换,然后再恢复堆序,继续向下比较。这样的话最后这个堆里面保存的就是最小的

2017-07-25 22:28:08 222

转载 红黑树

一、什么是红黑树???  红黑树首先是一棵搜索二叉树,树中的每一个结点的颜色不是黑色就是红色。它的特性如下:  1、根节点是黑色  2、每一个结点不是黑色就是红色  3、不能有连续的两个红色结点  4、从任意一个结点出发,到后代中空指针的路径上,均包含相同数量的黑色结点。例如:  二、为什么要有红黑树?

2017-07-25 19:03:28 194

原创 B树

B树是一种适合与外查找的的搜索树,他是一种平衡的多叉树。在B树的每个结点中包含一组指针recptr[M]指向实际记录的存放地址。key[i]与recptr[i]形成一个索引项,通过key[i]可以找到某个记录的存储地址recptr[i]。M阶的B树具有以下特点:1、根节点要么是叶子结点,要么至少具有两个孩子。2、非根结点(叶结点除外)都具有[M/2,M]个孩子。

2017-07-24 17:39:04 291

转载 AVL树

AVL树又称作高度平衡二叉树,它实际上是一种优化了的搜索二叉树。我们知道,由于二叉搜索树存在缺陷,有可能会退化成单链表,这样的话搜索的效率就降低了。为了将二叉搜索树的效率控制在O(logN)的级别,所以我们要给二叉搜索树加上一些条件,使得二叉搜索树高度平衡,时间复杂度为O(logN)。概念:1、首先AVL树是一颗二叉搜索树。2、其次它的左子树和右子树都是AVL树

2017-07-24 17:04:19 210

原创 二叉搜索树

一、二叉搜索树的性质:1、每个结点都有一个作为搜索依据的关键码,并且这个关键码是互不相同的2、左子树上的所有结点的关键码都小于根节点的关键码3、右子树上的所有结点的关键码都大于根节点的关键码4、左右子树也是二叉搜索树例:二、二叉树搜索树所支持的操作1、查找  在二叉搜索树上进行查找,是从根节

2017-07-24 14:52:50 135

转载 线索化二叉树

[cpp] view plain copy    线索化二叉树为我们提供了一种不需要递归和借助栈就能遍历一颗二叉树的方法,如果将二叉树写成STL的形式,那么线索化就可以为之提供迭代器,这也是线索化二叉树的最主要的用法。线索化二叉树有三种方式,前序线索化,中序线索化和后序线索化。一般只要掌握前序线索化和中序线索化就可以了。后序线索化遍历的时候要借助于三叉链表或者Fin

2017-07-24 12:12:50 216

原创 排序 快排

一、快速排序的过程快速排序:  快速排序是一种划分交换的方法,它采用分治法进行排序。其基本思想是取待排序元素序列中的某个元素作为基准值,按照这个元素的大小,将整个元素序列划分成两个左右两个子序列,使得左子序列的值都比这个元素小,右子序列中的值都比这个元素值要大于或等于,基准元素值则排在这两个序列中间,然后再对这两个子序列进行同样的方法,直到所有元素都排在相应的位置(即序列中只有一个

2017-07-24 12:00:32 295

原创 排序 归并

归并排序是一种基于分治法的一种排序方法。它将要排序的序列分成两个长度相等的子序列,为每一个子序列进行排序,然后再将子序列合并成一个有序的序列。实现:[cpp] view plain copyvoid _MergeSort(int *a,int begin,int end,int *tmp)  {        

2017-07-24 11:59:23 133

转载 排序 计数排序

计数排序主要思想:  给定一组要排序的序列,找出这组序列中的最大值,然后开辟一个最大值加1大小的数组,将这个数组里面的元素全部置零,然后用这个数组统计出要排序的序列中各个元素出现的次数。等到统计完成的时候,排序就已经完成了。例:  计数排序是一种非比较的排序方法,它的时间复杂度是O(N+K),空间复杂度是0(K),其中K是要排序的数组的范围。

2017-07-24 11:57:34 139

转载 排序 基数排序

基数排序的主要思想:  基数排序又称"桶子法",他从低位开始将待排序的数按照这一位的值放到相应的编号为0到9的桶中。等到低位排完之后得到一个序列,再将这个序列按照次低位的大小进入相应的桶中。以此类推,直到将所有的位都排完之后,这组数就已经有序了。例:  基数排序是一种非比较排序,它的时间复杂度是O(N*digit),其中digit是这组待排序

2017-07-24 11:56:22 170

原创

图是一种非线性数据结构,由顶点集合(vertex)和边的集合组成的一种数据结构。Graph=(V,E);V={x|x是顶点集合}; V是顶点的集合E={|x,y属于V}; E是边的集合图分为无向图和有向图。1、无向图2、有向图完全图:在由n个顶点组成的无向图中,若有N(N-1)/

2017-07-24 11:54:09 347

原创 链表面试题

从尾到头打印单链表(栈  递归)//从尾到头打印链表#includevoid PrintTailToHead(ListNode* Head){ stack s; ListNode* Node=Head; while(Node!=NULL) { s.push(Node); Node=Node->_next; } while(!s.empty()) { cout_dat

2017-07-23 14:00:05 102

原创 二叉树

二叉树是一种非线性结构,用途非常广泛。二叉树它的每一个结点的度都不大于2,所以一般用二叉链表来实现二叉树。二叉链表:   二叉树可以分为根结点和左子树,右子树。左子树和右子树依旧可以这样划分。所以二叉树是典型的递归结构,所以用递归来实现二叉树的逻辑是非常简单的,只要不断的对二叉树进行划分即可。递归创建二叉树的时候选择先序创建时最简单的。#incl

2017-07-23 13:35:53 139

原创 面试题31连续子数组的最大和

题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间负责度为O(n)。看到这个题目,我们首先想到的是求出这个整型数组所有连续子数组的和,长度为n的数组一共有 n(n+2)/2个子数组,因此要求出这些连续子数组的和最快也需要O(n^2)的时间复杂度。但是题目要求的O(n)的时间复杂度,因此上述思路不能解决问题。看到O(

2017-06-04 19:12:13 153

原创 面试题30最小的k个数

题目:输入n个整数,找出其中最小的k个数,例如输入4,5,1,6,2,7,3,8这8个数字,则最小的四个数字为1,2,3,4方法一:1.首先随机查找数组中一个元素作为一个基准,然后parition一次使得数组左边的元素小于基本,数组右边的元素大于基准。2.此时将再将基准插入到数组适当的位置并返回该位置的索引。3.如果索引index小于k-1则继续在[index+1,en

2017-06-04 18:40:33 202

原创 面试题29数组中出现次数超过一半的数字

题目描述:  数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。  例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。题目分析解法一:基于快排中分割算法的方法  数组中有一个数字出现的次数超过了数组长度的一半。如果把这个数组排序,那么排序之后位于数组中间的数字一定就是那个出现次数超过数

2017-06-04 16:18:43 171

原创 面试题28字符串的排列

题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 思路:把一个字符串看成两部分组成:第一部分为第一个字符,第二部分为后面的所有字符。求整个字符串的排列,可以看出两步:首先求所有可能出现在第一个位置的字符,即把第一个字符和后面的所有字符交

2017-05-31 21:19:55 166

原创 面试题24二叉搜索树的后序遍历序列

面试题24:二叉搜索树的后序遍历序列1.输入一个整数的数组,判断该数组是不是某棵二叉搜索树的后序遍历序列。假设输入的数组的任意两个数字互不相同。分析:例如输入数组{5,7,6,9,11,10,8},则返回true,因为这个序列可以找到这样的一棵二叉搜索树满足条件,而对于序列{7,4,6,5}则找不到这样的二叉搜索树。二叉搜索树的性质是,左子树的节点的

2017-05-31 20:21:16 170

原创 面试题27二叉搜索树与双向链表

题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。比如输入图4.12 中左边的二叉搜索树,则输出转换之后的排序现向链表。结点定义:public static class BinaryTreeNode { int value; BinaryTreeNode left; Bin

2017-05-31 19:13:04 134

原创 面试题26复杂连标的复制

题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下:                struct ComplexNode{    int m_nValue;    ComplexNode* m_pNext;    ComplexNode* m_

2017-05-31 12:37:32 167

原创 面试题25二叉树中和为某一值的路径

题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶结点所经过的所有的结点形成一条路径。如下图,输入二叉树和整数22,则打印出两条路径,第一条路径包含结点10,12,第二条路径包含的结点为10,5,7.一般的数据结构和算法的教材都没有介绍树的路径,因此对大多数应聘者而言,这是一个新概念,也就很难一下子想出完整的解题思路。这个时候

2017-05-31 12:22:05 335

原创 面试题23从上往下打印二叉树

题目:从上往下打印二叉树的每个结点,同一层的结点按照从左到右的顺序打印。例如输入下图的二叉树,则一次打印出8,6,10,5,7,9,11.这道题实质上考察的就是树的遍历算法,只是这种遍历不是我们熟悉的前序、中序或者后序遍历。由于我们不太熟悉这种按层遍历的方法,可能已下载也想不清楚遍历的过程。因为按层打印的顺序决定应该先打印的根节点,所以我们从树的根节点开始分析。为了接下

2017-05-30 21:22:57 162

原创 面试题22栈的压入弹出序列

剑指offer-面试题22.栈的压入,弹出序列题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该该压栈序列的弹出序列。本题的题解步骤如下:1.设置一个辅助栈S,用于模拟出栈

2017-05-30 20:38:12 175

原创 面试题21包含min函数的栈

题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。思路: 如果只用一个元素保存最小的元素,那么当最小的元素被弹出后,就没有办法得到剩余元素中最下的元素。 所以,最好的办法是将每次的最小元素(之前的最小元素和新压入的元素两者的较小者)都保存起来放到另外一个辅助栈里。这是剑指offer书中的举例一个模拟过程: #include

2017-05-30 19:09:20 157

原创 面试题20顺时针打印矩阵

题目:输入一个矩阵,按照从外向里以顺时针的顺序一次打印出每个数字,例如1 2 3 4 5 6 7 8 9 10 11 1213 14 15 16则一次打印出数字:1 2#includeusing namespace std;void printNumber(int number){ printf("%d\t", number);}void Pri

2017-05-30 18:30:31 146

原创 面试题19二叉树的镜像

题目:请完成一个函数,输入一个二叉树,该函数输出他的镜像树。算法分析:            求一棵树的镜像过程:我们先前序遍历这棵树的每一个节点,如果遍历到节点有子节点,就交换它的两个子节点。当交换完所有非叶子子节点的左右子节点后,就得到了树的镜像。树的镜像是一个比较新的概念,我们未必能够一下子相出求树的镜像的方法。为了能够形成直观的印象,我们可以自己画一棵二叉树

2017-05-28 17:28:56 250

原创 面试题18树的子结构

题目: 输入两颗二叉树A和B,判断B是不是A的子结构。如下图:树B是树A的子结构。方法一:分析:要判断树B是否为树A的子结构,可以分为两步,第一步在树A中找到和树B的根节点的值一样的结点R,第二步再判断树A中以R为根节点的子树是不是包含和树B一样的结构。#includeusing namespace std;struct BinaryTreeNode{ int

2017-05-25 16:19:07 184

原创 面试题17合并两个排序链表

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增顺序的。struct ListNode{      int    m_nKey;      ListNode*    m_pNext;}测试用例:1)功能测试(输入的两个链表有多个结点,结点的值互不相同或者存在值相等的多个结点);2)特殊输入测试(两个链表的一个或者两个头结点为nul

2017-05-25 16:15:21 153

原创 面试题16反转链表

面试题16:反转链表题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。 假设有链表A->B->C->D->E->F->G。在反转链表过程中的某一阶段,其链表指针指向为:AF->G。也就是说在结点D之前的所有结点都已经反转,而结点D后面的结点E开始的所有结点都没有反转。这样D跟E之间存在了断裂。我们如果要实现链表的反转,会有以下几个重要步骤

2017-05-25 16:09:02 130

空空如也

空空如也

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

TA关注的人

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