数据结构基础
文章平均质量分 54
无情的搬砖机器
不求甚解
展开
-
心里的那点B“数”
前言我们知道二叉排序树的查找时间复杂度和树的深度有关,可是如果本来数据趋于有序构建的二叉排序树就会退化成一颗只有单节点的树甚至是链表,这样平衡二叉树就登场了,解决了该问题,使得左字树和右子树的高度差不超过1,这样避免了树的退化。那么对于多叉排序树而言,是否存在同样的解决办法构建出一颗平衡的多叉排序树?有的,就是今天的主角:B树。1、B树的定义需要满足的第一个条件:树中每个节点至多有m个孩子节点需要满足的第二个条件:除根结点外,其他非叶子节点至少有[m/2]个孩子节点需要满足的第...原创 2021-10-17 14:05:09 · 97 阅读 · 0 评论 -
拓扑排序
墙裂推荐一下B站青岛大学--王卓老师的教学视频https://www.bilibili.com/video/BV1Ut41197TE?t=85AOV网(Activity On Vetex network):顶点表示活动AOE网(Activity On Edge network):边表示活动一、AOV网的特点:二、拓扑排序的步骤三、代码实现记录自己的实现思路,代码比较粗糙。这里的前驱顶点就是入度数,可以遍历一次输入数组就可以计算所有节点的入度数了,具体的实现.原创 2020-11-15 00:02:51 · 227 阅读 · 0 评论 -
多叉树的前序遍历
参考连接https://www.jianshu.com/p/b6dd69a80ce6这里需要注意一下,二叉树的前序遍历中直接右子节点先入栈然后左子节点入栈,在多叉树中,某个节点存在多个子节点,使用for循环逆序遍历入栈即可。...转载 2020-11-07 09:15:45 · 1345 阅读 · 0 评论 -
课程笔记:二叉树的顺序存储结构和遍历算法
一、二叉树的顺序存储结构在存储二叉树之前要先给二叉树节点排号,排号方法是:根节点为1,左孩子节点为2i+1,右孩子节点为2i+1.创建存储空间的时候,空节点也是需要标注出来的,所以创建的存储空间大小为排号最大的节点数编号规则:顺序存储结构:对于完全二叉树或者满二叉树(满二叉树一定是完全二叉树),不存在空孩子刚好存满对于一般二叉树:对于单支二叉树:...转载 2019-01-26 11:14:25 · 3454 阅读 · 0 评论 -
课程笔记:二叉树遍历算法的应用
一、统计叶子节点数目1、根据遍历思想求解2按照先序变量的思想 也可以根据中序遍历和后序遍历的思想2、根据分治法求解:二叉树的度只能为2,1,0三种情况,度为0表示当前节点为叶子节点。分治的思想是分别统计出左孩子和右孩子叶子节点的数目然后相加代码实现:二、求二叉树的高度1、后序遍历求解主要思路就是分别遍历左右子树求出左子树和右子树的深度,然后返回...转载 2019-01-26 11:32:48 · 338 阅读 · 0 评论 -
链表反转步骤分解附图
该思路需要创建三个指向节点的指针,分别是current、current_previous、current_next.创建current指向头节点,创建current_next指向空,创建current_previous指向空。具体如下:代码:参考连接:https://www.cnblogs.com/wanglei5205/p/8572458.html反转链表函数的返回值为反转链表...原创 2019-03-19 20:15:12 · 1319 阅读 · 0 评论 -
通过节点类创建和打印链表
构造函数是使用了默认数据域为0,默认指针域为NULL#include<iostream>#include<cstdlib>//size_tusing namespace std;//用结构体类型表示一个节点class Node {public: typedef double value_type; Node(const value_type&...原创 2019-03-19 21:08:44 · 223 阅读 · 0 评论 -
链表操作(完)
C++实现链表操作使用节点类构造节点包括 创建链表,显示链表,插入节点,删除节点,查找节点,链表长度和反转链表一、头文件 list.h 包括节点类的构造,各种操作函数的声明#ifndef __LIST_H__#define __LIST_H__#include<iostream>#include<cstdlib>//size_tusing n...原创 2019-03-19 21:24:58 · 330 阅读 · 0 评论 -
二叉排序树基础(学习笔记)
一、基本概念:二叉排序数又称为二叉搜索树、二叉查找树定义:二叉排序树或是空树,或是满足如下性质的二叉树:(1)若其左子树为非空,则左子树上所有节点的值均小于根节点的值(2)若其右子树为非空,则右子树上所以节点的值均大于等于根节点的值(3)其左右子树又各是一颗二叉排序树例子如下:左子树的节点值都小于根节点,右子树的节点值都大于等于根节点(左):值,(右):首字母...转载 2019-03-25 10:13:15 · 684 阅读 · 0 评论 -
二叉排序树的操作(学习笔记)
一、二叉排序树的插入操作需要注意的是:如果树中已有该元素则不再插入.二、二叉排序树的生成操作二叉排序树形态不一样,查找效率就会不一样。三、二叉排序树的删除操作删除节点分三种情况:a)被删除的节点为叶子节点:直接删除,使其双亲节点指针域指向空即可b)被删除的节点只有左子树或者只有右子树,直接使用左子树或者右子树替换该节点即可c)前两种都比...转载 2019-03-25 10:56:02 · 492 阅读 · 0 评论 -
平衡二叉树基础(学习笔记)
一、知识回顾二、平衡二叉树的定义例子:① 如下左图二叉排序中,看根节点的左子树高度为2,右子树高度为3,高度差为-1,左右各子树高度差如图计算所示,所以该二叉排序树为平衡二叉树。② 如下右图二叉排序树中,看根节点的左子树高度为2,右子树高度为3,高度差为-1,满足,但是看各节点是否都满足的时候发现值为53的节点,左子树高度为0,右子树高度为2,差值绝对值>...转载 2019-03-25 12:24:38 · 422 阅读 · 0 评论 -
二叉树的类实现和递归遍历思路
#ifndef BINTREE_H#define BINTREE_H#include<cstdlib> //提供size_ttemplate<class Item>//表示这个是类模板class binary_tree_node {public: typedef Item value_type; binary_tree_node(const Item&...转载 2019-03-18 21:52:48 · 360 阅读 · 0 评论 -
二叉树实现猜动物小游戏
该游戏玩法如下:描述:自己脑海里想一只动物,然后根据计算机的提示输入yes/no,让计算机它猜你脑海中的动物,如果它猜不对就将自己的动物输入到计算机,让它记住能保证下次它能猜出来。源文件main.cpp#include<iostream>#include<cstdlib>#include<string>#include"bintree...原创 2019-03-23 21:13:02 · 2020 阅读 · 0 评论 -
再看异或
异或的性质A)交换律 a^b = b^a;B)结合律 (a^b)^c = a^(b^c);C)x^x = 0,x^0 = x;D)自反性:A xor B xor B = A xor 0 = A;一、一个数组存放若干个整数,一个数出现了奇数次,其余的数出现偶数次,找出出现奇数次的这个数。比如 1 2 3 2 3 1 5 4 4 ,找出5int process(vect...原创 2019-09-12 12:19:43 · 332 阅读 · 0 评论 -
三种简单的排序方法基本思想以及利用对数器检测算法
一、冒泡排序1、从第0个位置开始和后面的做比较,一直到 n-1 位置。只要前一个比后一个大就互换位置.2、比较一轮后就将最大的数放在了n-1位置.3、然后再从0位置开始和后面的做比较,一直到 n-2 位置。只要前一个比后一个大就交换位置.4、所以大循环从end = n-1开始,然后 end--,内循环i从0开始 i++到end位置.void bubble_sort(int...转载 2018-12-06 21:14:50 · 534 阅读 · 0 评论 -
栈的简单应用
1、进制转换进制转换的过程中,我们用短除法得到余数,然后最后将余数倒过来写,这个和栈的后进先出的原理一致,所以可以使用栈实现。将每次得到的余数都压入栈中 #include<iostream>#include<stack>using namespace std;void convert(stack<char>& s, int n, i...转载 2018-11-29 11:23:54 · 407 阅读 · 0 评论 -
汉诺塔详解及C++实现
汉诺塔是典型的递归问题,这个问题可以这样描述:完成目标:将n个block块从A搬运到C,求需要移动多少次完成?约束条件:搬运的过程中每次只能移动一个block块,且不能出现大的block块在小的block块之上。详细分析如下:为了分析将A中的n个block搬到C中,我们先分析一下n分别等于1,2,3的简单情况,在进行搬运之前我们有如下约定:1、move(n,A,B,C)表示将n...转载 2018-10-15 19:03:29 · 17267 阅读 · 3 评论 -
向量容量递增策略简析
向量基本操作: 图片来源:《数据结构-邓俊辉》 图片来源:《数据结构-邓俊辉》 向量扩容策略分析:向量扩容策略有两种,分别是递增测量和翻倍测量,下面结合书本分析一下。向量递增扩容:当向量size达到capacity的时候给capacity增加一个常量 图片来源:《数据结构-邓俊辉》 考虑最坏的情况:每一次扩容 I ,第一次申请需要进行 I 次复制,第二...转载 2018-10-16 11:22:12 · 888 阅读 · 0 评论 -
创作一个bag容器类
这是一个比较有趣又简单的练习,适合入门练习。创建一个自己的bag类,存放自己家庭成员的年龄,具体实现如下:bag1.h#ifndef MAIN_SAVITCH_BAG_H#define MAIN_SAVITCH_BAG_H#include <iostream>namespace main_savich_3{ class bag { public: ty...转载 2018-10-22 17:25:30 · 428 阅读 · 0 评论 -
指针与动态数组初步+动态数组元素个数确定方法
一、学到指针与动态数组赶紧记录一下用new操作符为数组分配内存尤其有用,因为数组的元素个数往往是在程序运行时才能计算得出的 ——《数据结构与面向对象程序设计》(C++版)Michael Main等编著下面是一部分简单的代码#include<iostream>using namespace std;int main(){ //动态数组的存在就是因为数组的元素个数往...转载 2018-10-25 13:07:03 · 2541 阅读 · 0 评论 -
创作一个sequence类
参考:《数据结构与面向对象程序设计》(C++版)Michael Main等编著sequence类与bag类不一样,bag类删除一个元素可以直接将最后一个元素取代即可,但是在sequence中,删除一个元素需要保持原来的顺序,所以需要将删除的元素后面的每一个元素向前挪动一个位置,并且 used-1.sequence1.h:#ifndef MAIN_SAVITCH_SEQUENCE_H...转载 2018-10-23 19:39:04 · 937 阅读 · 0 评论 -
以指针作为引用参数(二)
题目(一):编写一个函数,把一个整数数组中的前n个元素复制到另一个数组的前端。其中一个数组应该为常量参数,另一个数组应为为普通的数组参数。#include<iostream>using namespace std;//传入其中一个数组为常量参数,另一个数组为普通数组//因为需要改变数组A的内容,所以参数为普通数组,不需要改变数组B的的内容,所以为常量参数(const)v...转载 2018-10-31 11:17:04 · 1099 阅读 · 0 评论 -
以指针作为引用参数(一)
有时候,函数的确需要修改指针参数,使得该指针指向一个新的位置,程序员也需要这样的修改,来影响实参。这就是以指针作为参数的唯一情况!参考:《数据结构与面向对象程序设计》(C++版)Michael Main等编著下面的例子创建了一个名为allocate_doubles的函数,它为一个新的动态数组分配内存。下面是该函数的原型:void allocate_doubles(double*&am...转载 2018-10-30 11:51:36 · 5705 阅读 · 0 评论 -
具有动态数组的bag类
前面有一篇博客提到如何创建一个bag容器类,使用的是静态数据结构,它的大小是在程序编译时确定的。现在介绍一种使用动态数据结构创建一个bag类,其大小是在程序运行时确定的,也就是动态数组,注意new和delete的使用。bag2.h#ifndef MAIN_SAVITCH_BAG2_H#define MAIN_SAVITCH_BAG2_H#include <cstdlib>...转载 2018-11-06 08:28:43 · 533 阅读 · 0 评论 -
STL的string类及其基本操作
目录 一、strcpy(),strcat(),strlen(),strcmp()② 字符串不同于其他数据类型。在使用 = 赋值语句不能使用字符串变量。如果使用 == 来测试字符串的相等性也不会得到希望的结果。所以一般在定义的时候初始化如 char greeting[] = "Hello".或者使用strcpy()给字符串进行赋值,使用strcmp()对字符串进行比较.二、strin...转载 2018-11-06 17:05:55 · 481 阅读 · 0 评论 -
string.reserve()和string.resize()
参考出处: https://blog.csdn.net/oppo62258801/article/details/759498021、string.reverse()reverse()针对的是string的capacity,容量初始大小一般是15,使用reserve进行扩容,容量大小按照(n*16-1)分配因为capacity容量按照(n*16-1)分配,20>15,所以分配...转载 2018-11-08 21:55:58 · 1176 阅读 · 0 评论 -
链表基本操作(学习笔记)
一、节点类的构造函数函数原型:node(const value_type& init_data = value_type(), node* init_link = NULL);构造函数的第一个参数是传递到数据域的引用参数,第二个参数是一个指向节点的指针函数实现: node(const value_type& init_data = value_type()...转载 2018-11-14 22:01:55 · 532 阅读 · 0 评论 -
遍历链表+链表的参数
一、遍历链表在操作链表的函数中将频繁使用遍历链表这种编程模式,比如:计算链表节点个数for(cursor = head_ptr; cursor != NULL; cursor =cursor->link()){ //在循环体中,可以执行操作链表中节点所需的任何计算}(1)假设cursor指向某个节点(2)那么cursor->link()就指向下一个节点(...转载 2018-11-12 21:14:27 · 664 阅读 · 0 评论 -
用链表实现bag类
前面实现过使用数组创造一个bag类容器,使用动态内存分配实现一个bag类容器,现在我们使用链表来实现一个bag类,会结合前一篇文章的一些内容,链表的基本操作(学习笔记)。这个bag类主要包括四个文件,分别是node1和node1.cpp,bag3.h和bag3.cpp,和主函数main().bag3.h#include <cassert>#include <cst...转载 2018-11-20 11:11:36 · 441 阅读 · 0 评论 -
Mark 一下,今天开始学习数据结构
很高兴今天能抽空开始学习数据结构,使用的是邓俊辉老师的视频和书本,多多指教[抱拳]代码功能是实现找出数组中最大和次大的数,下面的代码中只要不调用max2_3还是能正确运行的[滑稽]#include <iostream>using namespace std;void max2_1(int A[],int lo,int hi,int& x1,int& x...原创 2018-10-11 20:27:43 · 184 阅读 · 0 评论