优秀视频教程:郝斌老师、传智播客扫地僧
链表核心
一定要有表头!
一切操作基于表头!
线程池的原理就是基于表头操作!
递归核心
void fun(int n)
{
if(n==1)
printf("哈哈哈");
else
fun(n-1);
}
int main(void)
{
fun(3);
return 0;
}
调用时一直往里调用,终止点一直往外返回。利用这个特点咱们可以解决很多问题。
传统链表
typedef struct _list {
void *data;
struct _list *prev, *next;
};
Linux内核链表
struct _list {
struct _list *prev, *next;
};
struct _data {
void *data;
struct _list list;
};
企业级通用链表
struct _list { //节点模型
struct _list *prev, *next;
};
typedef struct _node {
struct _node *prev, *next;
}NODE;
struct _head {
NODE header;
int length;
};
struct _data { //业务模型
NODE linker; //链表节点域(指针域)
void *data; //链表的数据域(链表算法与业务节点分离思想)
};
常用链表算法:创建、删除节点、插入节点、取出节点、销毁
链表算法设计经验:抽象的地方用简单例子来理解。
二叉树与递归
二叉树数据结构定义
二叉树数据结构定义:总结:
数据结构的定义还是比较自由的,只要有左右指针域就可以了。
二叉树递归法创建
二叉树递归法创建:总结:
其中重要的思想有递归以及二叉树的结构性质;递归的核心思想就是自己只干自己的事,处理上面传递进来的参数以及条件,如果无法完成任务就传给孩子去完成这项使命;二叉树的核心理论就是它的结构性质,也就是说当前节点的左右孩子的左右孩子也必须要初始化(NULL),也就是说当前节点的孙子都要指向空指针来表示结尾,否则永远找不到树顶,直到栈溢出也无济于事。传递经来的root是在主调用函数中已经初始化的,
二叉树遍历
二叉树递归遍历:总结:
通过二叉树的结构图来辅助解析这段代码,你的思路会异常清晰。
二叉树定位
二叉树删除操作
二叉树主函数初始化root
二叉树深度和节点数的关系公式总结:
deep=01, node=01
deep=02, node=02
deep=03, node=04
deep=04, node=08
deep=05, node=16
最后总结出来的数学公式为:2^(deep-1),即2的(deep-1)次方。
图的最优路径
图的最优路径都是根据前面的递归基础引申来来的,所以前面的递归和二叉树一定要熟练掌握它的核心思想,二分法查找也是递归的应用一种,二分法排序也是递归的应用。