数据结构/算法
数据结构/算法
Ricardo、ov0
这个作者很懒,什么都没留下…
展开
-
试编写一个算法,使之能够在数组L[1...n]中找出第k小的元素(即从小到大排序后处于第k个位置的元素)
试编写一个算法,使之能够在数组L[1…n]中找出第k小的元素(即从小到大排序后处于第k个位置的元素)重要的事情说三遍:代码不是我写的!代码不是我写的!代码不是我写的!这是王道数据结构第8章第3节的一道题,记录在博客上方便以后回顾。如有谬误或者不足还请批评指正!以下是书上对该题的解答:本题最直接的做法是用排序算法对数组先进行从小到大的排序,然后直接提取L(k)便得到了第k小元素,但其平均时间复杂度将达到O(nlog2n)以上。此外,还可采用小顶堆的方法,每次堆顶元素都是最小值元素,时间复杂度为O(n原创 2020-05-23 18:16:05 · 1819 阅读 · 1 评论 -
TopologicalSort(拓扑排序)
TopologicalSort(拓扑排序)重要的事情说三遍:代码不是我写的!代码不是我写的!代码不是我写的!是严蔚敏数据结构(C语言版)上写的,记录在博客上以后比较好找。如有谬误或者不足还请批评指正!Status TopologicalSort(ALGraph G){ //有向图G采用邻接表存储结构 //若G无回路,则输出G的顶点的一个拓扑序列并返回OK,否则ERROR FindInDegree(G, indegree); //对各顶点求入度indegree[0...G.vexnum-1]原创 2020-05-09 15:59:58 · 739 阅读 · 0 评论 -
Dijkstra(迪杰斯特拉)算法求单源最短路径问题
Dijkstra(迪杰斯特拉)算法求单源最短路径问题重要的事情说三遍:代码不是我写的!代码不是我写的!代码不是我写的!第一个算法是严蔚敏数据结构(C语言版)上写的,第二个算法是王道数据结构上写的,我想着记录在博客上以后比较好找。如有谬误或者不足还请批评指正!void ShortestPath_DIJ(MGraph G, int v0, PathMatrix &P, ShortPat...原创 2020-05-08 16:02:13 · 585 阅读 · 0 评论 -
树、图的常用性质
树、图的常用性质如有谬误或者不足还请批评指正!二叉树:n 个结点的树中有 n-1 条边树中的结点数等于所有结点的度数加一度为 m 的树中第i层上至多有 mi-1 个结点(i>=1)高度为 h 的 m 叉树至多有 (mh-1)/(m-1) 个结点具有 n 个结点的 m 叉树的最小高度为 ⌈logm(n(m-1)+1)⌉总结点数 = n0+n1+n2+…+nm总分支数 = 1...原创 2020-05-01 11:59:25 · 642 阅读 · 0 评论 -
例题:设二叉树的存储结构为二叉链表,编写有关二叉树的递归算法
例题:设二叉树的存储结构为二叉链表,编写有关二叉树的递归算法如有谬误或者不足还请批评指正!(1)统计二叉树中度为0、1、2的结点个数int num_0 = 0, num_1 = 0, num_2 = 0;void CountNode(BiTree T){ if (T == NULL) return; if ((T->lchild && !T->rch...原创 2020-04-29 16:26:20 · 8822 阅读 · 6 评论 -
判断给定的二叉树是否是二叉排序树
判断给定的二叉树是否是二叉排序树根据二叉排序树的定义,左子树结点值 < 根结点值 < 右子树结点值,所以对二叉排序树进行中序遍历(LNR),可以得到一个递增的有序序列。因此,对给定的二叉树进行中序遍历,若始终能保持前一个值小于后一个值,则说明该二叉树是一颗二叉排序树。栈的基本操作以严蔚敏编写的教材为准。如有谬误或者不足还请批评指正!基于非递归中序遍历算法判断:int pre ...原创 2020-04-28 16:56:18 · 10288 阅读 · 1 评论 -
在二叉排序树中删除一个结点
二叉排序树的删除在二叉排序树中删除一个结点时,不能把以该结点为根的子树上的结点都删除,必须先把被删除结点从存储二叉排序树的链表上摘下,将因删除结点而断开的二叉链表重新链接起来,同时确保二叉排序树的性质不会丢失。二叉排序树的删除要考虑三种情况:若被删除结点x是叶子结点,则直接删除,并修改x的父结点的指针为NULL;若被删除结点x只有一棵左子树或右子树,则让x的子树成为x父结点的子树,替代x...原创 2020-04-25 13:18:01 · 5243 阅读 · 2 评论 -
设计算法求以孩子兄弟链表为存储结构的树的深度
设计算法求以孩子兄弟链表为存储结构的树的深度基于层次遍历的非递归算法,逐层遍历树,取得树的高度。队列的基本操作以严蔚敏编写的教材为准。如有谬误或者不足还请批评指正!int GetDepth(CSTree bt){ InitQueue(Q); //初始化队列 CSNode *p = bt; //p为遍历指针 EnQueue(Q, p); //根节点入队 int depth = 0;...原创 2020-04-24 15:29:48 · 5216 阅读 · 3 评论 -
设计算法求二叉树的带权路径长度(WPL)
设计算法求二叉树的带权路径长度(WPL)二叉树的带权路径长度(WPL)是二叉树中所有叶结点的带权路径长度之和。队列的基本操作以严蔚敏编写的教材为准。基于层次遍历的算法:int WPL_LevelOrder (BiTree T){ int L = 0; //L是当前层结点到根节点的路径长度,即所经过的边的个数 int WPL = 0; //WPL为二叉树的带权路径长度 BiTNode...原创 2020-04-22 20:58:22 · 5540 阅读 · 1 评论 -
编写算法找到二叉树中任意两个结点p和q的最近公共祖先结点r
编写算法找到二叉树中任意两个结点p和q的最近公共祖先结点r采用后序非递归算法,栈中存放二叉树结点的指针,当访问到某节点时,栈中所有元素均为该结点的祖先,然后将这些元素复制到一个辅助栈中。最后把两个辅助栈当成两个普通数组,从0号元素开始访问,相同则记录位置,不同则退出,返回最后记录的位置的结点,就是最近公共祖先。栈的基本操作以严蔚敏编写的教材为准。BiTree Ancestor(BiTree ...原创 2020-04-22 14:31:30 · 3781 阅读 · 9 评论 -
判断给定二叉树是否是完全二叉树
二叉树按二叉链表形式存储,设计算法判断给定二叉树是否是完全二叉树根据完全二叉树的定义,具有n个结点的完全二叉树与满二叉树中编号从1~n的结点一一对应。算法思想:采用层次遍历算法,将所有结点加入队列(包括空结点)。遇到空结点时,查看其后是否有非空结点。若有,则二叉树不是完全二叉树。队列的基本操作以严蔚敏编写的教材为准。算法实现来自王道的数据结构5.3.3节综合应用题的第7题:bool IsC...原创 2020-04-22 10:15:18 · 4135 阅读 · 1 评论 -
设计一个算法求非空二叉树T的宽度(即具有结点数最多的那一层的结点个数)
设计一个算法求非空二叉树T的宽度(即具有结点数最多的那一层的结点个数)采用非递归层次遍历,队列的长度即为当前层的宽度。队列的基本操作以严蔚敏编写的教材为准。int BiTreeWidth(BiTree T){ InitQueue(Q); //初始化队列 BiTree p = T; //p为遍历指针 int MaxWidth = 0; //宽度初始化为0 EnQueue(Q, p);...原创 2020-04-21 22:37:13 · 1252 阅读 · 7 评论 -
在二叉树中查找值为x的结点,打印值为x的结点的所有祖先,假设值为x的结点不多于一个。
在二叉树中查找值为x的结点,打印值为x的结点的所有祖先,假设值为x的结点不多于一个。采用非递归后序遍历算法,最后访问根节点,访问到值为x的结点时,栈中所有元素为该结点的祖先,从栈底到栈顶结点再加上当前访问的结点,刚好构成从根节点到当前访问结点的一条路径。在很多算法设计中都可以利用这一思路来求解,如求根到某结点的路径、求两个结点的最近公共祖先等。栈的基本操作以严蔚敏编写的教材为准。void P...原创 2020-04-21 21:42:45 · 10958 阅读 · 9 评论