栈:
1.元素进栈:栈对象.push(元素);
2.取栈顶元素:栈对象.top(辅变量)
3.栈顶出栈:栈.pop();
队:
1.定义队列:Queue q;
2.当前节点入队:队列名.append(i)
3.头结点出队:队列名.server();
4.读取队头元素:队列名.retrieve(辅助变量)
扩展队:
1.判断队空:empty()注:不需要加参数,也无需队列调用
2.清空队列:clear()
表:
1.insert(位置,插入的元素):把元素插入到“位置+1”的位置
2.插入元素到表中:表名.insert(位置,插入的元素)
3.让指针指向某位置的前一个节点:set_position(位置-1);
4.让当前指针指向某个位置current=set_position(位置)
5.双向链表某个节点的前一个节点:xx->back()
2.插入元素到表的最后:表名.insert(表名.size(),插入的元素)
6.移除表的某个数据并用辅变量记录: 表名. remove(位置, data) ;
字符串:
1.字符串1是否大于字符串2:strcmp(字符串1,字符串2)
2.将字符串转换成常量字符数组:字符串. c_str( )
3.
查找:
1.表越长越大,二分查找越有优势,因为表越长,log n 越小
排序:
1.链式插入排序:从前往后(升序)去比较并插入
2.顺序插入排序:从后往前(逆序)去挨个比较并插入
3.顺序插入排序的取值范围是2-n,故最大键比较次数:1+2+...(n-1)=(n-1)n/2
4.选择排序的比较次数:(n-1)n/2 注:交换次数不固定
快速排序:
1.辅之前记录的元素一般是小于支点的某元素,辅之前下一个位置的元素一般是大于支点的元素。因为下一个位置元素只有大于支点才能将它和后面小于支点的元素对换
基数排序:
收集:即桶往右边倒
哈希表:
1.链式哈希的优点:节省空间、处理冲突简单有效、不需要哈希表长度记录超出、很容易删除元素
2.
二叉树:
1.左/右子树高度:recursive_height(当前节点 -> right/left)
2.用某数据创建一个二叉树节点:new binary_node
二叉查找树:
1.二叉查找树是比较树,左<根<右。构建:第一个数据为根,大则右孩。是有序表的一种实现
2.二叉查找树最坏的情况,每个节点都需要比较,比较n次,即退化成顺序查找
3.以自然顺序(递增或递减)插入的二叉查找树是一个直线型的树,不利于查找,比较n次
4.删除:删除的节点只有左子树或右子树,则直接用子树代替被删节点,被删节点是双亲节点的右孩子,则用子树作为双亲的右孩子
5.删除:被删节点既有左子树又有右子树,则首先用被删节点的左孩子(右孩子)的最右(最左)子节点的数据特换被删节点的数据,然后删最右(最左)子节点:最右(最左)子节点is叶节点?直接删最右(最左)子节点:用最右(最左)子节点的子树代替最右(最左)子节点
5.有左右孩子的删除:先往左走一步,然后一直往右走,直到无路可走
树排序376:
1先构建二叉查找树,然后对二叉查找树进行中序遍历?
2.优点:查找树对于后期的插入和删除任可用,其它排序插和删比较麻烦
3.缺点:不适于有序(自然顺序)数据组。给定的一组数据已经有序,则不利于树排序。有序也不利于快排
二叉查找树:
1.二叉查找树左右子树有序,即左<根<右
2.key和record是键和值的关系?
3.
AVL平衡二叉树:
1.删除:删除的节点只有左子树或右子树,则直接用子树代替被删节点,被删节点是双亲节点的右孩子,则用子树作为双亲的右孩子
2.删除:被删节点既有左子树又有右子树,则首先用被删节点的左孩子(右孩子)的最右(最左)子节点的数据特换被删节点的数据,然后删最右(最左)子节点:最右(最左)子节点is叶节点?直接删最右(最左)子节点:用最右(最左)子节点的子树代替最右(最左)子节点
3.平衡因子:左高、等高、右高
4.获取当前节点的平衡因子:sub_root->get_balance()
多路树:
1.子节点可以超过2个
trie树:
1.
B-树:
1.分支数=关键字数+1
2.每个节点的分支数至少为最大分支数的一半,奇则向上取整
3.B-树的查找是类似于“二分性质”的查找
4.插入时首先考虑叶节点,若超范围则拆分
5.不论是大于范围还是小于范围,调整时选的双亲节点一定是中间那个
60.删除时小于范围了,则找双亲节点和左边或右边组合,然后重选双亲关键字
B+树:
1.节点的关键字数=节点的分支数
2.
红黑树:
1.根叶为黑;红的子为黑
2.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。(黑平衡)
3.插入节点首选红色
图:
1.环:至少包含三个顶点
2自由树:没有环的连通无向图
3.vertices:顶点
4.图深度,树前序;图广度,树层次
5.广度优先是割草,深度优先是锯木头
6.自由树就是一个无回路的连通图
邻接图:
1.当前节点未被访问:!visited(i)
2.遍历与某个顶点相邻接的所有顶点:for(all i adjacent to v)
3.图中两个顶点的距离(权值):adjacency[v][i]
拓扑:
取当前顶点的度
贪心算法:一个点到任一点的最短路径
1.生成树的最后一个顶点:刚并入生成树的顶点,用辅助变量v来记录,即辅最后
2.标记当前顶点为最短路径点(把当前顶点添加到生成树上):found[i]=true;
prim最小生成树:
1.当前顶点入树(标记访问):compent[i]=true;
2.将当前顶点邻接到生成树的最后顶点:neighbor[i]=v;
1.return
①return 0;一般0代表的是正常结束
②return -1; -1代表非正常结束
③return ;:void 返回是空,void返回值可以什么也不写
④return NULL;数据类型是指针类型,成功则返地址,失败则返NULL
书知识点的页码:
栈:61
链栈和链式队列:104
二叉树:366
图:595
建立二叉查找树:385?
avl树:396
C++:
1.endl 用于在行末添加一个换行符
2.流插入运算符 <<
3.流提取运算符 >>
4.输入多个数据:cin >> name >> age;
5.指针运算符 & 返回变量的地址。例如 &a; 将给出变量的实际地址。
6.指针运算符 * 指向一个变量。例如,*var; 将指向变量 var。
7.指针是一个变量,其值为另一个变量的地址(指针即地址变量)
8.引用 是某个已存在变量的另一个名字
9.类型后面加&符声明的“常量”就是引用
10.结构的指针访问结构的成员,您必须使用 -> 运算符:结构体指针->结构体成员
11.typedef 的好处是:用typedef 别名来定义变量,不需要加结构struct关键字
12.在类的外部使用范围解析运算符 :: (//定义一个成员函数的操作是:)函数返回类型 类名 :: 成员函数名()
13.“外部”的成员函数,要使用其所属类的变量,直接使用,不需要类名来调取
14.可以使用:: 在外部定义构造函数
15.Line::Line( double len): length(len)表示在成员函数里调用成员函数length并为其赋值len,参数“double len”的len传给“length(len)”的len,最后赋值给length
16.类名::构造函数名(参数1,参数2,..):成员函数1(参数1),成员函数2(参数2)
17.析构函数:特殊的构造成员函数,它会在每次删除所创建的对象时执行
18.析构函数:类名::~类名(){..} 调用:~类名()
19.友元函数:行成员函数之效果,无成员函数之实(不是成员函数),需要从参数那对象并访问成员
20.基类的函数可以在子类重载,须在基类的方法名前加virtual
21.指针 *a指向指针 *b:a=b
算法:
《排序》
①**选择排序的顺序实现
降序遍历表:(当前位置之后的元素都有序)
在未排序中找出最大者
交换最大者和当前位置(未排序的尾元素)
**找最大
用辅最大记录表的第一个元素
遍历表:从第二个元素到未排序的最后一个元素
如果:辅最大位置的数据<当前位置的数据
则:更新辅最大为当前位置。
返回辅最大
**交换最大者和未排序的尾元素swap()函数
辅临时记录最大者
更新辅最大位置的元素为未排序的尾元素
更新未排序的尾元素为辅临时记录的数据
②*308*顺序表的快速排序recursive_quick_sort
如果:首<尾
则:把首尾参数传入切分表函数,返回支点,用辅支点接收
递归首到支点前一个元素,
递归支点的后一元素到尾的元素
*310*切分表函数partition()
交换‘首’和中间的支点的元素
用支点记录交换后的首元素
用‘辅支前’记录首位置
遍历表:从首位置的后一个元素到尾元素
如果:当前元素<支点
则:让辅支前的位置后移一个,
交换辅之前位置的元素和当前元素。
交换首元素和辅支前的元素
返回辅支前
③**基数排序radix_sort()
遍历:从后往前遍历集合
当:移除第0个元素到辅数据的操作成功
则:拿到当前位置的元素,找到当前元素的队列(桶),用辅队列号记录之
将当前数据追加到其对应的队列。
将队列们重组
元素找桶(队列)函数alphabetic_order()
如果:元素参数是空格 则返0(号桶/队列)
如果:元素参数介于小写字母之间
则:返当前元素-‘a’+1
如果:元素参数介于大写字母之间
则:返当前元素-‘A’+1
(其他情况:)
返回27
重组队列(桶)rethread
遍历:队列们
当:当前队列(桶)不为空
则:读当前队列队头的数据并记录到辅数据
将辅数据插入到队列中
当前队列的队头出队
《二叉树》:
①**求树叶数
如果:根为空 则返0结束
如果:当前节点的左右孩子为空,则返当前节点一个节点数
否则:返回递归左子树的叶子数+递归右子树的叶子数
②**求二叉树的节点数
如果:根空
则:返0
否则:
返回当前节点数1加上递归左子树节点数,再加递归右子树的节点数
③**求二叉树高度
如果:当前节点为空 则返0结束
递归左子树拿到左子树最大高度
递归右子树拿到右子树最大高度
如果:左子树高度大于右子树高度
则:返回当前节点1个高度再加左子树高度
否则:返回当前节点1个高度再加右子树高度
④**插入节点到二叉树
如果:当前节点为空
则:使用参数数据构造节点对象,将创建的对象赋给当前节点
否则:如果右子树高度<左子树高度
则:传入右孩子和参数数据,递归之
否则:传入左孩子和参数数据,递归之
⑤**复制二叉树(拷贝构造函数)
如果:当前节点为空
则返0结束
否则:
用当前节点的数据去创建一个辅节点
递归当前节点的左孩子,用辅节点左指针记录之
递归当前节点的右孩子,用辅节点右指针记录之
返回辅节点
⑥**删除二叉树所有节点
创建二叉树辅助节点去记录当前节点
如果:当前节点为空 则返0结束
递归清除左子树
递归清除右子树
置当前节点为空
删除辅助节点记录的节点
⑦双序遍历二叉树:
就是先访问当前节点,
然后递归左子树,
再次访问当前节点(访问两次当前节点),
递归右子树
⑧**交换左右子树
如果:当前节点不为空
则:创建一个临时节点,并把当前节点的左孩子赋给临时节点
更新当前节点的左孩子为当前节点的右孩子
更新当前节点的右孩子为临时节点
递归当前节点的左孩子
递归当前节点的右孩子
⑨二叉树层次遍历
如果:根节点不为空
则:创建队列
把根节点追加到队列中
循环:读取队头元素,存到辅节点
//访问当前节点的数据
如果:当前节点有左孩子
则:把当前节点的左孩子添加到队列。
如果:当前节点有右孩子
则:把当前节点的右孩子添加到队列。
头结点出队
当:队列不为空
⑩**:求二叉树的(最大)宽度
如果:根节点为空 则返0
创建一个辅队列1
将根节点入队
声明一个辅宽度,初始宽度为0
当:辅队列的尺寸不为0时
①如果:队列的尺寸大于辅宽度
则:更新辅宽度为队列1的尺寸。
② 创建队列2
③循环:声明一个辅节点,
用辅节点读取队头节点,
如果:当前节点(辅节点/队头节点)有左孩子
则:将当前节点的左孩子添加到队列2
如果:当前节点右孩子存在
则:将当前节点的右孩子添加到队列2
队头出队
当:队列1不空
返回辅宽度
《二叉查找树》
①*371*递归查找二叉树某节点search_tree()
如果:当前节点为空或当前节点数据为目标数据
则:返回当前节点(为空,返的null)
否如:当前节点数据小于目标数据
则:返回递归右子树的结果
否则(当前节点数据大于目标数据):
返回递归当前节点的右子树的结果
②**非递归查找二叉树某节点search_tree()
当:当前节点不空或当前节点数据不为目标数据
如果:当前节点数据小于目标数据
则:让当前节点指到自己的右孩子
否则:让当前节点指向自己的左孩子
返回当前节点
③*376*递归插入节点到二叉树search_and_insert(递归生成二叉查找树)
如果:当前节点为空
则:用新数据创建节点对象,然后赋给当前节点
返回插入成功
否如:新数据小于当前节点的数据
则返回:递归当前节点的左孩子和新数据
否如:新数据大于当前节点的数据
则返回:递归当前节点的右孩子和新数据
否则:返回插入失败
③##非递归插入节点到排序树
如果:根节点为空
则:用新数据构建一个二叉树节点对象并赋给空的根节点
用一个辅指针1指向根节点
循环:辅指针2指向辅指针1所指节点,
如果:新数据<辅指针1的数据
则:让辅指针1指到自己的左孩子
否如:新数据>辅指针1的数据
则:让辅指针1指到自己的右孩子
否则:返错码
直到:辅指针1不为空
用新数据构造一个节点对象并赋给辅指针1
如果:新数据小于辅指针2的数据(说明辅指针1是2的左孩儿)
则:设置辅指针2的左孩子为辅指针1
否则:设置辅指针2的右孩子为辅指针1
返成功码
④*378*删除二叉查找树的某节点
如果:当前节点为空
则:返回“不存在”。
创建辅助指针1记录当前节点
如果:当前节点的右孩为空
则:更新当前节点为左孩子。
否如:当前节点的左孩为空
则:更新当前节点为右孩子。
最后否则:(当前节点既有左孩又有右孩)
辅助指针1记录当前节点的左孩,
创建辅指针2记录当前节点,
当:辅指针1的右孩不为空
则:辅指针2记录辅指针1,
辅指针1记录辅指针2的右孩
更新当前节点的数据为辅指针1的数据,
如果:辅指针2等于当前节点
则:更新当前节点的左孩为辅指针1的左孩。
否则:更新辅指针2的右孩为辅指针1的左孩。
删除辅指针1
返回“成功”
《AVL平衡二叉树》
*398*AVL平衡二叉树的节点插入
如果:当前节点为空
则:用新数据构造节点并赋给当前节点
标记高度增加
否如:新数据=当前节点的数据
则:标记结果码为错码
标记高度未增加。
再否如:新数据<当前节点的数据
则:递归当前节点的左孩子,递归结果标记到结果码中
如果:高度增加
则:
判断:获取当前节点的平衡因子
情况1:左高
则:让当前节点左平衡
标记高度未增加
跳出循环
情况2:等高
则:传入左高因子,重调当前节点的平衡因子
跳出循环
情况3:右高
则:传入等高因子并重调当前节点的平衡因子
标记高度未增加
跳出循环
否则:递归当前节点的右孩子并将递归结果标记到结果码
如果:高度增加
则:
判断:获取当前节点的平衡因子
情况1:左高
则:传入等高因子并重调当前节点的平衡因子
标记高度未增加
情况2:等高
则:传入右高因子并重调当前节点的平衡因子
跳出循环
情况3:右高
则:让当前节点右平衡
标记高度未增加
跳出循环
返回结果码
《trie树》
①*442*trie树查找trie_search
trie节点类型的辅指针指向根节点
当:辅指针不为空且辅变量记录的目标字符串的第0个位置的数据不为空
则:用辅变量记录的数据计算出当前节点(辅指针)的子节点,让辅指针指向这个子节点
目标字符串的位置加1。
如果:辅指针不为空且辅指针所指节点的数据不为空
则:把辅指针所指节点的数据引用传参
返成功
否则:返不存在
②*443*trie树插入insert
初始结果码为成功
如果:根节点为空
则:创建新trie节点赋给根节点
创建辅指针指向根节点
当:辅指针不为空且辅变量记录的新数据字符串的第0个位置的数据不为空
则:用辅变量记录的数据计算出在树中的位置
如果:辅指针这个位置的子节点为空
则:创建新节点并赋给辅指针这个位置的子节点
将辅指针指向这个位置的子节点
新数据的位置加1
如果:辅指针所指向的节点不为空
则:设结果码为复制错误
否则:用新数据构造一个节点并赋给辅指针所指向节点的数据变量
返结果码
#541#按长度遍历trie树的单词 depth_traverse
如果:根不空
则:创建辅队列
将根节点追加到辅队列
循环:创建辅当前节点
读取辅队头元素记录到辅当前
访问辅当前节点的数据
遍历:当前节点的所有分支
如果:当前节点的当前分支(当前子节点)不为空
则:将当前节点的当前子节点追加到辅队
队头出队
直到:队不空
#541#删除trie树的某单词remove
如果:根不空
则:返不存在
创建辅指针指向根节点
当:辅指针不为空且目标数据的当前位置的字符不为空
则:用目标数据的当前位置的字符计算出对应的分支参数
如果: