
数据结构
胡小哲
捧着看不懂的故事,道着懵懂的错对。
展开
-
二叉树创建与遍历
二叉树的创建定义:二叉树是每个节点最多有两个子树的树结构。通常子树被称为”左子树”和”右子树”。二叉树的每个节点最多只能右两棵子树,子树有左右之分,次序不能颠倒。概念:1.满二叉树:除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。2.完全二叉树:假设二叉树的高度为K,除第K层外,其他各层的节点数都达到最大个数。也就是第一层到第K-1层为一个满二叉树。第K层有叶子节点,并且叶子结点都原创 2017-10-16 19:45:37 · 697 阅读 · 0 评论 -
常见排序算法
排序概念将一组杂乱无章的数据按照一定的规律组织起来。排序分内部排序和外部排序。 如果整个排序过程不需要访问外存便能完成,则称此类排序为内部排序。若参加排序的记录数量很大。 整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。常见的排序算法插入排序直接插入排序原理: 每一次将一个待排序的元素,按其关键字的大小插入到已经排好序的一组元素的适当位置上,直到所有待排序元素全部插入为止。原创 2018-01-16 20:23:52 · 344 阅读 · 0 评论 -
二叉搜索树
概念:二叉查找树(Binary Search Tree) (又:二叉搜索树,二叉排序树) 它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 当我们对二叉搜索树进行中序遍历时,可以得到一个关键字的有序序列。插原创 2018-01-30 20:08:11 · 198 阅读 · 0 评论 -
huffman树
概念 给定 n 个权值作为 n 个页子节点,构造一颗二叉树,若带权路径长度达到最小,称这样的二叉树为哈夫曼树。huffman树是带权路径长度最短的树,权值较大的节点离根节点较近。构造 huffman 树 1、由给定的n个权值{w1,w2,w3,…,wn}构造n棵只有根节点的二叉树森林F= {T1,T2,T3,…,Tn},每棵二叉树Ti只有一个带权值wi的根节点,左右孩子均为空。 2、重复以下步原创 2018-01-03 13:50:41 · 427 阅读 · 0 评论 -
堆
堆是一类特殊的 数据结构的统称,堆通常是一个可以被看作一棵树的数组对象。 堆满足的性质: 1.任一节点的值总是不大于或不小于其父节点的值。 2.堆总是一棵完全二叉树。 3.大堆/小堆。先将数组用完全二叉树的形式表现出来 此时可以发现,这棵树并不满足堆的性质。所以我们需要对这棵树进行调整,调整为大堆 / 小堆。 我们发现,在这里可以将问题分化为,可以先处理根节的左子树和右子树,最后再处原创 2018-01-03 13:34:46 · 346 阅读 · 0 评论 -
二叉树线索化
首先提出一个问题 为什么要线索化二叉树?二叉树遍历的本质上是将一个复杂的非线性结构转换为线性结构,使每个节点都有了唯一前驱和后继(第一个节点无前驱,最后一个节点无后继)。对于一个节点,查找其左右子树是方便的,但是查找其前驱和后继只能在遍历中找到。 线索化二叉树解决了无法直接找到该节点在某种遍历序列中的前驱和后继节点的问题。可以在节点结构中增加前驱和后继的指针,但是增加了存储开销。另一种方法是利用原创 2017-12-05 19:16:46 · 1045 阅读 · 0 评论 -
矩阵(Matrix)
特殊矩阵的存储对称矩阵在这里给出一组对称矩阵 因为其对称性,我们不需要存储其全部内容,只需要存储其下三角矩阵或者上三角矩阵。 在这里我选择存储下三角矩阵。 设矩阵的行数为M. 则需要存储的元素个数为 M(M+1)/2,以行优先进行存储。当对此矩阵进行访问时,我们在内存中存储的数据应该是 当我们要访问第3行第2列(即i>=j)的元素时,便可以通过对其在存储的数据中的偏移量进行读取原创 2017-11-24 19:24:38 · 1506 阅读 · 0 评论 -
二叉树面试题
1.求二叉树节点个数 可以使用递归解决。将问题分解为求根节点+左子树的节点数+右节点的节点数。 实现 :public: size_t _Size() { //封装调用 return Size(_root); }private: size_t Size(Node *root){ //二叉树中节点个数 if (ro原创 2017-12-02 11:23:29 · 265 阅读 · 0 评论 -
栈的应用
栈的应用1.括号匹配在这里我们给出一组带括号的表达式 1.(()))abcd[]{}; 2.((()){{bcd}}; 3.((]){}[]{{}}; 4.()(){}{[]}[];需要我们去判断里面的括号之间是否匹配 此时可能出现几种情况 1.右括号比左括号多 2.左括号比右括号多 3.括号不匹配 4.括号匹配成功 在这里可以利用栈后进先出的运算方式 将原创 2017-11-17 16:47:53 · 382 阅读 · 0 评论 -
使用堆栈(Stack)模拟实现队列(FIFO)
使用堆栈(Stack)来模拟实现队列(FIFO)功能,要求数据必须存储再堆栈内部。 需要实现: enqueue(入队) dequeue(出队) Empty(判空)因为堆栈和队列的线性运算不同,在这里只使用一个堆栈是不够的,我们可以用两个堆栈联合完成队列的模拟。 当入队时,将入队的所有元素压入堆栈 stack1 中。 当出队时,将 stack1 中的所有元素压入 stack2 中,如果此时原创 2017-10-25 00:18:06 · 4663 阅读 · 0 评论 -
栈和递归解决迷宫问题
先给出一个迷宫的模型。0代表通路,1代表墙壁,知道出入口后,找到入口到出口之间的通路。 先给出一个简单迷宫模型 现在令下方为出口方向,[2,0]作为入口寻找通路。将走过的路程标记为2。 此时可以发现迷宫存在一个分叉口,假如以顺时针方向对是否存在通路进行判别,则必定会先走没有出口的那一条死路,而当走进死路时,需要进行回溯。 此时可以开辟一个栈用来维护这条通路,先将入口进行压栈,随后判别通路原创 2017-10-12 21:25:39 · 591 阅读 · 0 评论 -
AVL 树
由于之前的搜索二叉树在单支树的情况下,时间复杂度依然为 O(N),所以我们应该对其进行调整,此时遍出现了 AVL 树,AVL 树是最先发明的自平衡二叉搜索树。在AVL树中,在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是 O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。特点 : 1. AVL树本身依然原创 2018-02-05 17:19:42 · 185 阅读 · 0 评论