学习算法和刷题的框架思维
短暂记录下对于《算法小抄》的学习,因为对于文章的学习遇到瓶颈,决定暂时暂停,对于前面所有文章进行复习
一、数据结构的存储方式
数据结构的存储方式只有两种:数组(顺序存储)和链表(链式存储)
对于问题的分析一定要有递归的思想,自顶向下,从抽象到具体 。对于散列表、栈、树堆等等数据结构其实都属于【上层建筑】,而数组和链表才是【结构基础 】。对于所有多样化的数据结构,究其源头,都是在链表和数组上的特殊操作,只不过存在API不同罢了。
而对于一些上层建筑的解释,不在进行叙述,可以自己去学习算法和刷题的框架思维 :: labuladong的算法小抄 (gitee.io)进行查看。
二、数据结构的基本操作
对于任何数据结构,基本的操作其实就是遍历+访问,也就是常说的CRUD(增删改查)。
数据结构存在的目的就是在不同的应用场景,尽可能高效的增删改查
数据结构遍历可分为:线性和非线性
数组遍历框架,典型的线性迭代结构:
void traver(int[] arr){
for(int i=0;i<arr.size();i++){
//迭代访问arr[i]
}
}
链表遍历框架,兼具迭代和递归结构:
/*基本的单链表节点*/
class ListNode{
int val;
ListNode* next;
}
void traverse(ListNode* head){
for(ListNode* p=head;p!=nullprt;p=p->next){
//迭代访问p->val
}
}
void traverse(ListNode* head){
//递归访问head->val
traverse(head->next);
}
二叉树遍历框架 ,典型的非线性递归遍历结构:
/*基本的二叉树节点*/
class TreeNode{
int val;
TreeNode* left,right;
}
void traverse(TreeNode* root){
traverse(root->left);
traverse(root->right);
}
仔细观察会发现二叉树的递归遍历和链表的递归遍历方式十分相似,二叉树结构和单链表结构也十分相似。
二叉树框架可以扩展为N叉树的便利框架
/*基本的二叉树节点*/
class TreeNode{
int val;
vector<TreeNode*>children;
}
void traverse(TreeNode root){
for(TreeNode* child:root->children){
traverse(child);
}
}
N
叉树的遍历又可以扩展为图的遍历,因为图就是好几 N
叉棵树的结合体。你说图是可能出现环的?这个很好办,用个布尔数组 visited
做标记就行了,这里就不写代码了。
本文来自博客园,作者:{BailanZ},转载请注明原文链接:https://www.cnblogs.com/BailanZ/p/16057620.html