要注意学习的网站是这个:
https://labuladong.gitbook.io/algo/
1.
首先讲了一些数据结构的基础知识,包括有两种存储类型:数组(顺序存储),和链表(链式存储)
这些基础知识就不展开讲了,基本上学过数据结构的,都有所了解。
其中,印象比较深的就是,作者说了,对于大部分数据结构来说,基本操作就是遍历加访问,再者就是增删改查(我真觉得很有道理,对于原理的最基本解析)
2.
一些经典框架:(用线性和非线性作为区分)
2.1 数组遍历框架
void traverse(int[] arr){
for(int i=0;i<arr.length;i++)
{
//再开始迭代访问arr[i]
}
}
2.2链表遍历框架
class ListNode{
int val
ListNode next;
}
void traverse(ListNode head){
for(ListNode p=head;p!=null;p=p.next)
{
//再就是迭代访问p的值
}
//也可以递归的来
void traverse(ListNode head){
//在里面继续调用
traverse(head.next)
}
二叉树遍历框架,也就是非线性递归的
(线性就是那些for/while,而非线性就是那些调用函数的递归)
class TreeNode{
int val;
TreeNode left,right;
}
void traverse(TreeNode root){
traverse(root.left);
traverse(root.right);
}
然后在二叉树的基础之上,将二叉树框架扩展成为N叉树框架
N叉树框架
class TreeNode{
int val;
TreeNode[] children;//这里不只是有左边和右边,有很多个
}
void traverse(TreeNode root){
for(TreeNode child:root.children)//创建一个child是在那里里面的
traverse(child);
}
所以说,有了这些框架,就可以做各种各样的题目了(当然这个是理论上来说的,毕竟具体题目可比这个难多了。。。)
3
在算法刷题指南上,作者重点强调了,***先刷二叉树***这样一个很“特别”的建议。他说:“二叉树是最容易培养框架思维的,而且大部分算法技巧,本质上都是树的遍历问题”
也就是三大遍历:前序,中序,和后序遍历。当然这也是大佬的说法,对于我这种小菜鸡来说,还是需要刷题才能明白。。
所以我也准备老老实实,先刷这些树分类的题目刷。