
数据结构
文章平均质量分 69
jun2016425
coolnqjun@163.com
展开
-
单链表反转,单链表创建,单链表尾部插入,单链表打印
其实,给我感觉,单链表的反转跟链表头部是同一个原理!原创 2016-08-06 16:35:21 · 549 阅读 · 0 评论 -
重建二叉树
输入前序遍历和中序遍历的序列,然后通过这两个序列构建出二叉树。 C语言代码如下:typedef struct binary_tree_node{ int value; struct binary_tree_node *left; struct binary_tree_node *right;}bt_node;bt_node * construct(原创 2017-08-30 15:52:55 · 215 阅读 · 0 评论 -
合并两个排序的链表
合并两个排序的链表,如图: 已排序链表1和已排序链表2合并后的已排序链表3过程: (a)链表1的头结点的值小于链表2的头结点的值,因此链表1的头结点是合并后链表的头结点。 (b)在剩余的结点中,链表2的头结点的值小于链表1的头结点的值,因此链表2的头结点是剩余 结点的头结点,把这个结点和之前已经合并好的链表的尾结点链接起来。 递归方式#include <stdio.h>typedef st原创 2017-09-24 11:42:14 · 338 阅读 · 0 评论 -
从尾到头打印链表
从尾到头打印链表,这里的链表一般都是指单链表,因为如果是双向链表就没什么可以打印的了。方法一(利用栈)因为链表是头到尾的去遍历的,如果要从尾到头的去遍历,那么很容易想到栈这种数据结构来解决这个问题。 栈这种数据结构,如下图堆积起来的书,只能从顶部堆积(即push操作)或者拿走(即pop操作)书籍。 代码如下:typedef struct listnode{ int key; st原创 2017-08-29 11:10:39 · 292 阅读 · 0 评论 -
红黑树
什么是红黑树红黑树是特殊的二叉搜索树,它比二叉搜索树多了一点颜色. 红黑树的五个性质: 1. 每一个结点要么是红色,要么是黑色 2. 根结点必须是黑色 3. 每个叶子结点(NIL)为黑色 4. 如果一个结点是红色,那么它的两个孩子结点都为黑色 5. 对于每个结点,从该结点到其所有后代叶子结点的简单路径上,均包含相同数目的黑色结点红黑树的结构体如下: 至少包含:color, key,原创 2017-07-20 18:25:43 · 382 阅读 · 0 评论 -
二叉搜索树(遍历不递归,不用栈)
什么是二叉搜索树一棵二叉搜索树是以一棵二叉树来组织的,如下图: 这样的一棵树可以使用一个链表数据结构来表示,其中每个结点就是一个对象。除了key和卫星数据之外,每个结点还包含属性left, right 和 parent, 它们分别指向左孩子,右孩子和双亲。比如:typeof struct node{ int key; // other data... 即卫星数据 str原创 2017-07-03 23:28:51 · 1577 阅读 · 0 评论 -
hlist内核哈希链表应用-解决散列表表的冲突问题
散列表我们都知道在散列函数(如h)将关键字映射到散列表的槽中,关键字k2k_2和k5k_5映射到一个槽中,因而产生冲突,如图1: (图1) 有问题就有解决的办法,这里的解决办法就是链接法(chaining),链接法是怎么样的呢,如图2: (图2) 那么图2这个链接法是怎么建立的呢,我用的是C语言,借鉴的是Linux内核的哈希函数:例子:将关键字 5, 28, 19, 15, 20,原创 2017-07-02 00:13:17 · 498 阅读 · 0 评论 -
散列表
直接寻址表当关键字的全域U比较小时,直接寻址是一种简单而有效的技术。 另外,假设没有两个元素具有相同的关键字. 如图: 几个字典的操作实现比较简单: DIRECT_ADDRESS_SEARCH(T, k) return T[k]DIRECT_ADDRESS_INSERT(T, x) T[x.key] = xDIRECT_ADDRESS_DELETE(T, x) T[x.原创 2017-06-18 23:21:29 · 236 阅读 · 0 评论 -
栈和队列
栈和队列都是动态集合,且在其上进行DELETE操作所移除的元素都是预先设定的。 在栈stack中,被删除的是最近插入的元素:栈实现的是一种后进先出(last-in, first-out, LIFO)策略。 在队列(queue)中,被删去的总是在集合中存在时间最长的那个元素:队列实现的是一种先进先出(first-in, first-out, FIFO)策略。简单的数组实现栈和队列.原创 2017-05-07 21:52:18 · 1268 阅读 · 0 评论 -
任意有根树遍历
左孩子右兄弟的存储方式typedef struct tree_node{ ElemType data; tree_node *left_child; tree_node *right_sibling;} tree_node, *ptree_node;先根遍历 PREORDER(T)if T == NIL return NILprint(T)for p = T.原创 2017-05-31 11:47:06 · 425 阅读 · 0 评论 -
二叉树遍历
二叉链表typedef struct Node{ ElemType data; struct Node *lchild, *rchild; }Binode, *Bitree;注意点: 1)已知 前序遍历序列 和 中序遍历序列,可以唯一确定一颗二叉树 2)已知 中序遍历序列和 后序遍历序列,可以唯一确定一颗二叉树 而已知 前序和后序 是不能确定一颗二叉树的二叉树的遍历:原创 2017-05-27 17:25:52 · 436 阅读 · 0 评论 -
实现对一个含n个元素的单链表的逆转.要去除存储链表本身所需的空间外,该过程只能使用固定大小的存储空间.
这个逆转很简单,流程就是旧单链表从头部删除结点,然后将该结点从新单链表头部插入.设LSRC为原来旧单链表的头部,LDEST为逆转后的链表的头部. REVERSE(LDEST, LSRC)while LSRC.head != NIL x = LSRC.head LSRC.head = x.next x.next = LDEST.next LDEST.head = x原创 2017-05-27 15:24:10 · 369 阅读 · 0 评论 -
链表
链表链表分单向链表,双向链表 下面我看一下双向链表(最常用如图: (图一)双向链表查询查询程序LIST_SEARCH(L,k)找数据为k的元素在L里面,通过一个简单线性查找,返回一个指向这个元素的指针。如果k没有出现在出现在这个列表,则这个程序就会返回空(NIL)。LIST_SEARCH(L, k)x = L.headwhile x != NIL and x.key != k x =原创 2017-05-22 18:32:07 · 591 阅读 · 0 评论 -
二叉树特性及证明
在二叉树的第 i 层上至多有2^(i-1)个结点特性1:在二叉树的第 i 层上至多有2i−12^{i-1}个结点 证明: 设 第 i 层的结点至多为 N, 由上需证明 在二叉树的第 i 层上有N=2i−1N = 2^{i-1} ① i=1时,因为二叉树只有一层时只有一个根结点,故 202^0=1 成立 ② 假设,当 i =k 时,等式成立,即N=2k−1N = 2^{k-1}. 那么,当原创 2017-01-17 11:20:37 · 5041 阅读 · 2 评论 -
用两个栈实现队列
依据声明,实现函数:template <typename T> class CQueue{public: CQueue(void); ~CQueue(void); void appendTail(const T & node); T deleteHead();private: stack <T> stack1; stack <T> stack2;原创 2017-08-30 18:14:15 · 208 阅读 · 0 评论