摘要: 题目来自于记蒜客数据结构课,类型差不多,都是用bfs求最短路(注意是不加权的最短路,加权的情况后面的文章会讲)。 代码如下: 阅读全文
posted @ 2017-07-04 17:07 NoviScl 阅读(947) 评论(0) 推荐(0) 编辑
摘要: 我们可以在一开始把每个元素都看成一棵树,并且根结点的父结点指向自己,在此基础上完成查找、合并操作。 两种优化方法:第一种按秩合并,即每次都把较矮的树并到较高的树中。第二种路径压缩,即让所有的并入的结点都指向整棵树的根结点。 具体代码如下: 阅读全文
posted @ 2017-07-03 18:53 NoviScl 阅读(169) 评论(0) 推荐(0) 编辑
摘要: 图的遍历有两种:深度优先和广度优先。本文中,深度优先使用递归实现,每次递归找到第一个与当前结点相连且未输出过的结点继续往下递归,直至所有结点都已输出。广度优先将开始结点的所有邻接结点全部压入栈,当栈不为空时一直循环将栈首的结点的所有相邻结点压入栈。 具体代码实现如下: 阅读全文
posted @ 2017-06-28 12:49 NoviScl 阅读(1243) 评论(0) 推荐(0) 编辑
摘要: 图有两种存储方式,邻接表和邻接矩阵。 稀疏图一般用邻接链表,稠密图一般用邻接矩阵。 具体实现如下: 阅读全文
posted @ 2017-06-25 19:08 NoviScl 阅读(268) 评论(0) 推荐(0) 编辑
摘要: SBT是一种平衡二叉树结构,它与AVL的不同在于它的自平衡条件是结点的size大于等于其侄子结点的size。SBT的旋转操作与AVL类似,但是有一种较为简便的maintain方法。 由于在结点类中包含了结点的size(它所在的子树的结点个数),我们可以轻易地求得结点数据从小到大的rank并找到第k小 阅读全文
posted @ 2017-06-23 11:35 NoviScl 阅读(211) 评论(0) 推荐(0) 编辑
摘要: AVL树是一种自平衡二叉查找树。它的平衡因子等于它的左子树的高度减去它的右子树的高度。只有平衡因子等于1,0,-1的结点是平衡的,不平衡的结点需要通过旋转来保持平衡。因此,在AVL树中任何结点的两个子树的高度差的最大值为1。 google到了一篇代码很简洁易懂的文章,将其中的代码整理了一下: 测试结 阅读全文
posted @ 2017-06-20 19:15 NoviScl 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 二叉查找树的结构和普通二叉树相同。它要么是空树,要么满足:对任意结点,如果左子树不为空,则左子树上所有结点的权值都小于该结点的权值;如果右子树不为空,则右子树上所有结点的权值都大于该结点的权值。在二叉查找树中,任意结点的左子树和右子树都是一棵二叉查找树。一般而言,二叉树上结点的权值都是唯一的。 基本 阅读全文
posted @ 2017-06-18 22:15 NoviScl 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 线索二叉树的定义为:一个二叉树通过如下的方法 “穿起来”:所有应该为空的右孩子指针指向该节点在中序序列中的后继,所有应该为空的左孩子指针指向该节点的中序序列的前驱。 那么在有 N 个节点的二叉树中共有 N+1 个空指针,这些空指针就叫做 “线索”。(提示:在一个有 N 个节点的二叉树中,每个节点有 阅读全文
posted @ 2017-06-18 17:14 NoviScl 阅读(240) 评论(0) 推荐(0) 编辑
摘要: 1 //删除以cur为根结点的树 2 void delete_tree(node *&cur){ 3 if(cur!=NULL){ 4 delete_tree(cur->lchild); 5 delete_tree(cur->rchild); 6 //delete只是释放内存,指针可能成为野指针 7 ... 阅读全文
posted @ 2017-06-17 20:39 NoviScl 阅读(244) 评论(0) 推荐(0) 编辑
摘要: 1 //广义表转二叉树: 2 设置一个标记变量k,初始值为-1; 3 设置一个标记结点p; 4 循环遍历广义表的字符串str; 5 如果str[i]是左括号: 6 则设置k为0; 7 把p压入栈中。 8 否则如果str[i]是逗号: 9 则设置k为1。 10 否则如果str[i]是右括号... 阅读全文
posted @ 2017-06-16 10:44 NoviScl 阅读(4170) 评论(0) 推荐(0) 编辑