学习算法和刷题的框架思维

短暂记录下对于《算法小抄》的学习,因为对于文章的学习遇到瓶颈,决定暂时暂停,对于前面所有文章进行复习

一、数据结构的存储方式

数据结构的存储方式只有两种:数组(顺序存储)和链表(链式存储)

对于问题的分析一定要有递归的思想,自顶向下,从抽象到具体 。对于散列表、栈、树堆等等数据结构其实都属于【上层建筑】,而数组和链表才是【结构基础 】。对于所有多样化的数据结构,究其源头,都是在链表和数组上的特殊操作,只不过存在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 做标记就行了,这里就不写代码了。

posted @ 2022-03-26 08:38  BailanZ  阅读(38)  评论(0编辑  收藏  举报