数据结构
Dakuan_chen
这个作者很懒,什么都没留下…
展开
-
用两个栈实现一个队列
队列的特性是先进先出,栈是先进后出基于这种特性可以用一个辅助栈用于在pop和front是的操作其他的操作都可以用一个栈实现 在pop或front时将数据逐个出栈并且入到辅助栈中此时辅助栈的栈顶就是需要pop或front的元素之后再将元素放回原来的栈 在pop或front时 完成后将元素放入原栈template<typename T>class Queue{public:原创 2017-04-18 18:01:04 · 264 阅读 · 0 评论 -
线索二叉树
当某节点的左指针为空时,令该指针指向按照某种方式遍历二叉树时得到该节点的前驱结点;当某节点的右指针为空时,令该指针指向按照某种方式遍历二叉树时得到该节点的后继结点。但问题是无法区分:左指针指向的结点是左孩子结点还是前驱结点,右指针指向的结点是右孩子结点还是后继结点。因此需要增加两个线索标志位来区分这两种情况:#pragma once#include <iostream>using namespac原创 2017-05-08 19:09:03 · 324 阅读 · 0 评论 -
红黑树与迭代器的实现
红黑树是一棵二叉搜索树,它在每个结点上增加了一个存储位来表示结点的颜色,可以是red或者black,通过对任何一条从根节点到叶子结点上的简单路径来约束,红黑树保证最长路径不超过最短路径的两倍,因而近似平衡。红黑树具有一下性质 1、每个节点不是红的就是黑的 2、根节点一定是黑的 3、没有连在一起的红色节点 4、从根节点到每个叶子的路径上的黑色节点数目相等#pragma once#includ原创 2017-06-03 17:04:35 · 1018 阅读 · 1 评论 -
set/multiset map/multimap hash_set/hash_multiset hash_map/hash_multimap 区别与联系
set/multiset联系底层使用红黑树作为数据结构 set/multiset 特性是所有元素都会根据元素键值自动排序,set/multiset元素的键值就是实值,实值就是键值。 不能通过迭代器来修改set/multiset的实值因为他们的实值就是键值,修改后可能不满足其排列规则 set/multiset拥有与list相同的某些性质:当客户对他的元素进行insert或erase是操作之前的所原创 2017-07-01 22:11:50 · 414 阅读 · 0 评论 -
Huffman树的实现
假设给定一个有n个权值的集合{w1,w2,w3,…,wn},其中wi>0(1<=i<=n)。若T是一棵有n个叶结点的二叉树,而且将权值w1,w2,w3…wn分别赋值给T的n个叶结点,则称T是权值为w1,w2,w3…wn的扩充二叉树。带有权值的叶节点叫着扩充二叉树的外结点,其余不带权值的分支结点叫做内结点。外结点的带权路径长度为T的根节点到该结点的路径长度与该结点上的权值的乘积。n个外结点的扩充二叉树原创 2017-06-06 16:58:59 · 460 阅读 · 0 评论 -
堆的实现
如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki<= K2*i+1 且 Ki<= K2*i+2(Ki >= K2*i+1 且 Ki >= K2*i+2) i = 0,1,2…,则称这个堆为最小堆(或最大堆)。 大堆:根节点的关键字大于其他所有节点的关键字它的左右子树也满足这个性质 小堆:根节点的关键字小原创 2017-06-06 16:47:43 · 282 阅读 · 0 评论 -
二叉搜索树实现
二叉搜索树又称二叉排序树他是一颗空树或者具有一下性质的树 若他的左子树不为空那么它的左子树的所有节点的键值都小于根节点的键值 若他的右子树不为空那么它的右子树的所有节点的键值都大于根节点的键值 它的左右字数也是二叉搜索树对于二叉搜索树查找一个节点在一般情况下具有O(log2(n))的时间复杂度对于单支的情况下退化为O(n)本文采用键值对的方式实现二叉搜索树,建立二叉搜索树是通过插入一个个的节点原创 2017-05-30 10:13:07 · 281 阅读 · 0 评论 -
基于Huffman编码的文件压缩
文件压缩有很多种算法本文介绍的是基于Huffman算法的文件压缩 对于Huffman压缩最重要的就是建立Huffman树与重建Huffman树,本文对如何建立Huffman树不做重点讨论 首先将源文件遍历一遍统计其中每个字符出现的次数并将其 保存在下面的结构体中struct FileInfo{ FileInfo(unsigned char ch = char()) :_原创 2017-05-14 23:04:05 · 526 阅读 · 0 评论 -
二叉树的创建与前中后序遍历递归非递归
树的定义是递归的所以二叉树的定义也是递归的,一般先定义它的根节点在定义它的左子树再定义它的右子树,就像先序遍历一样struct Node{ Node(T data = T()) :_data(data) ,_lChild(NULL) ,_rChild(NULL) {} T _data; Node* _lCh原创 2017-05-01 20:01:26 · 435 阅读 · 0 评论 -
大数运算
计算机中的各种类型的数据都是有其表示上限的当进行很大的数据运算时可能产生溢出,这时就要用的大数运算 大数运算是将数据保存在数组或者string,vector的容器中进行运算这样就可以进行几十位甚至上百位的运算#pragma once#include <string>#include <iostream>#include <unistd.h>#include <stdlib.h>enum FL原创 2017-07-26 20:10:48 · 777 阅读 · 0 评论