-
图
图是另一种非线性结构,由顶点集合(vertex)及顶点间的关系集合组成的一种数据结构。Graph = (V, E); V = {x|x是顶点集合}; E = {<x,y> | x,y属于V} 1 邻接矩阵 ,对于N个点的图,需要N×N的矩阵表示点与点之间是否有边的存在。这种表示法的缺点是浪费空间,尤其是对于N×N的矩阵是稀疏矩阵,即边的数目远远小于N×N的时候,浪费了巨大的存
-
并查集
在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。动态连通性一类问题的一种算法,使用到了一种叫做并查集的数据结构,称为Union-Find。建模思路:最简单而直观的假设是,对于连通的所有节点,我们可以认为它们属于一个组,因此不连通的节点必然就属于不同的组。随着Pair的输入,我们需
-
数据结构中各种排序的思路
排序算法中的稳定和不稳定指的是什么?若在待排序的纪录中,存在两个或两个以上的关键码值相等的纪录,经排序后这些记录的相对次序仍然保持不变,则称相应的排序方法是稳定的方法,否则是不稳定的方法。内部排序和外部排序根据排序过程中涉及的存储器不同,可以讲排序方法分为两大类:一类是内部排序,指的是待排序的几率存放在计算机随机存储器中进行的排序过程;另一类的外部排序,指的是排序中要对外存储器进行访问的排序过程。
-
后序遍历求解判断一颗二叉树是否为平衡二叉树
题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。有了求二叉树的深度的经验之后再解决这个问题,我们很容易就能想到一个思路:在遍历树的每个结点的时候,调用函数TreeDepth得到它的左右子树的深度。如果每个结点的左右子树的深度相差都不超过1,按照定义它就是一棵平衡的二叉树。这种思路对应的代码如下:bool 
-
链表带环问题求解?是否带环,环的入口点,环长度
(1)链表是否有环?设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定相遇,设碰撞点为p。(当然,fast如果为NULL,则为无环链表)程序如下:bool IsExitsLoop(slist *head)
{
s
-
输入两棵二叉树A和B,判断树B是不是A的子结构
题目描述:题目:二叉树的结点定义如下:struct TreeNode{ int m_nValue; TreeNode* m_pLeft; TreeNode* m_pRight;};输入两棵二叉树A和B,判断树B是不是A的子结构。例如,下图
-
文件压缩项目
#include<iostream>
#include<vector>
#include<string>
#include<string.h>
#include<fstream>
#include<assert.h>
using namespace std;
#define _CRT_SECURE
-
RBTree(RED,BLACK)Tree
红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是Red或Black。通过对任何一条从根到叶子简单路径上的颜色来约束,红黑树保证最长路径不超过最短路径的两倍,因而近似于平衡。红黑树是满足下面红黑性质的二叉搜索树每个节点,不是红色就是黑色的根节点是黑色的如果一个节点是红色的,则它的两个子节点是黑色的(没有连续的红节点)对每个节点,从该节点到其所有后代叶节点的简单路径上,均
-
平衡查找二叉树
AVL树是平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。它能保持二叉树的高度平衡,尽量降低二叉树的高度,减少树的平均搜索长度。AVL树的性质左子树和右子树的高度之差的绝对值不超过1树中的每个左子树和右子树都是AVL树节点的平衡因子是它的左子树
-
搜索二叉树
二叉查找树(BinarySearch Tree,也叫二叉搜索树,或称二叉排序树Binary Sort Tree)或者是一棵空树,或具有如下性质:每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同。左子树上所有节点的关键码(key)都小于根节点的关键码(key)。右子树上所有节点的关键码(key)都大于根节点的关键码(key)。左右子树都是二叉搜索树。二叉搜索树相关
-
由二叉树的前序和中序如何得到二叉树的后序呢?
由二叉树的前序和中序如何得到二叉树的后序呢?首先得明白什么是前序、中序、后序。二叉树前序:遍历顺序为,根节点、左子树、右子树;中序:遍历顺序为,左子树、根节点、右子树;后序:遍历顺序为,左子树、右子树、根节点可以发现,二叉树前序中的第一个节点为树的根节点root,然后找出root在中序里面的位置,就可以把前序和中序分别划分为左、右子树两个部分,然后递归调用即可。#include<iostre
-
二叉树的镜像
镜像:右树由左树产生,像是从镜子中看。#include<iostream>
#include<stack>
using namespace std;
struct BinaryTreeNode
{
int data;
BinaryTreeNode* left;
BinaryTreeNode* right;
-
一个数组实现两个栈
//1.两个栈栈头在数组头尾(利用率高)
//2.两个栈栈头在数组中间(利用率低)
//3.奇偶下标分别为两栈(扩容时复制数据简单)
//实现1
template<class T>
class Stack
{
public:
Stack()
:_array(NULL)
, _q1Size(0)
, _q2Size(0)
,&nb
-
两个队列实现一个栈
1.//使用两个队列实现一个栈,优化版(1.入栈只如q1,出栈将q1数据倒q2,删掉刚进来的,
//若q1无数据,从q2倒,删q2中最后一个数据2.只保证一个栈中有数据,简单,易理解)
//第一种实现template<class T>
class Stack
{
public:
bool Empty()
{
return _q1.empt
-
两个栈实现一个队列
栈的特点:先进后出队列特点:先进先出//实现两个栈实现一个队列
//每次都push到_s1中,pop从_s2,提高效率(每次不用互相倒栈)#pragma once
#include<iostream>
#include<stack>
#include<queue>
#include<assert.h>
using namespac
-
检测出栈的合法性问题
题目:给定一个入栈和一个出栈序列?请判断是否合法eg:入栈12345,出栈35124用一个辅助栈,如果栈为空,就push(入栈序列)比较栈顶元素和出栈序列当前值是否相等,若相等,出栈此元素,并将下次访问出栈序列位置后移;否则,继续入入栈序列里的元素。重复1,2步骤,直到入栈序列为空,且栈顶元素不等于出栈序列当前访问位置时即不合法。栈空,入栈序列空,出栈序列空为合法出栈。此例中将3,5,取出后,明显
-
字符串匹配之通配符问题-
一串长为M的珠子,珠子的颜色有N种(N<10)。求包含N种颜色的最短连续珠串。//两个指针,开始的时候都指向某一个位置,移动前一个指针,直到两个指针直接包含了所有颜色的珠子。//此时记下len。//然后向前移动后面的指针,再调整最前面的指针,直到重新满足两个指针间包含了所有的颜色,比较此时的len和之前的len,取最小值。//如此移动,直到后面的指针回到起始位置。//时间复杂度是O(N),空
-
迷宫问题的求解方式:应用深度优先和广度优先的搜索
用堆栈实现迷宫问题,二维数组表示迷宫:1表示墙壁,0表示可以走的路,只能横着走或竖着走不能斜着走,要求编程实现找到从左上角到右下角的路线//深度优先:有解就退出搜索(不一定是最优解)
#include<iostream>
#include<stdio.h>
using namespace std;
#define ROW 5
#def
-
经典矩阵问题
//经典矩阵问题是利用数字生成一个矩阵,而该矩阵刚好是一个正方形,该矩阵内的数字是有
//规律的排序而形成矩阵。比较常见有以下形式
//1.
// 1 2 9 10
// 4 3 8 11
// 5 6 7 12
// 1
-
链表相交问题:判断两个链表是否相交,若相交求交点
默认为不带环链表,若带环则延伸为判断链表是否带环,若带环,求入口点看看两个链表相交到底是怎么回事吧,有这样的的几个事实:(假设链表中不存在环)
(1)一旦两个链表相交,那么两个链表中的节点一定有相同地址。
(2)一旦两个链表相交,那么两个链表从相交节点开始到尾节点一定都是相同的节点。#include<iostream>
#include<assert.h>
usin