专题**-数据结构与算法


优秀视频教程:郝斌老师、传智播客扫地僧

链表核心

一定要有表头!
一切操作基于表头!
线程池的原理就是基于表头操作!


递归核心

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)次方。

图的最优路径

图的最优路径都是根据前面的递归基础引申来来的,所以前面的递归和二叉树一定要熟练掌握它的核心思想,二分法查找也是递归的应用一种,二分法排序也是递归的应用。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值