前言
由于今天的理论内容及其之多,加上自己希望早点睡觉,所以今天的博客将主要讲述理论,具体的代码实现会放在明天的博客中。
概述
1.手写笔记
2.数据结构与算法理论
1.手写笔记
2.数据结构与算法理论
1. 树与递归算法
- 树的定义
树是一种递归定义的数据结构(max递归深度为4),由多个子树或森林组成。 - 树的结构
- 可由多个数组或森林表示
- 核心操作基于递归实现
2. 二叉树
性质
- 第 n 层最多有 2^(n-1) 个节点
- 完全二叉树的节点排列遵循特定规则
二叉树的类型
类型 说明 满二叉树 所有层节点数均达最大值 完全二叉树 除最后一层外完全填充,最后一层从左向右填充 遍历方法
前序遍历:根 → 左 → 右 (ABDEC) 中序遍历:左 → 根 → 右 (DEEAC) 后序遍历:左 → 右 → 根 (DEECA) 层次遍历:自上而下逐层遍历
创建代码
typedef struct tree_node { char data; struct tree_node* lchild; struct tree_node* rchild; } tree_node, *tree_p; tree_p create_tree() { char data; scanf("%c", &data); if(data == '#') return NULL; tree_p T = create_node(data); T->lchild = create_tree(); T->rchild = create_tree(); return T; }
3. 递归原理
// 基础形式
f(0) = C;
if(终止条件) return C;
f(n) = F[f(n-1)];
return F[f(n-1)];
实现要点
void func(...) { if(终止条件) return; // 执行体 func(参数); // 递归调用 }
4. 核心算法实现
折半查找(二分查找)
while (end > start) { int mid = (start + end) / 2; if(arr[mid] > key) end = mid - 1; else if(arr[mid] < key) start = mid + 1; else return mid; // 找到目标 }
快速排序
// 分区函数 int partition(int* arr, int low, int high) { int base = arr[low]; int left = low + 1, right = high; while(left <= right) { while(left <= right && arr[left] <= base) left++; while(left <= right && arr[right] > base) right--; if(left < right) swap(&arr[left], &arr[right]); } swap(&arr[low], &arr[right]); return right; } // 主函数 void quicksort(int* arr, int low, int high) { if(low >= high) return; int mid = partition(arr, low, high); quicksort(arr, low, mid - 1); quicksort(arr, mid + 1, high); }
插入排序
void insert_sort(int* arr, int len) { for(int i = 1; i < len; i++) { int temp = arr[i]; int j = i; while(j > 0 && arr[j-1] > temp) { arr[j] = arr[j-1]; j--; } arr[j] = temp; } }
5. 理论基础
算法定义
"算法 = 数据结构 + 计算方法"
程序 = 数据结构 + 算法时间复杂度
T(n) = O(f(n)) 常见复杂度: • O(1) 常数阶 • O(n) 线性阶 • O(n²) 平方阶 • O(nk) 多项式阶
图示说明
- 树形结构示意图(含A/B/C节点关系)
- 二叉树遍历路径示意图
- 递归调用栈示意图
注意事项
- 遍历本质:"第几次访问"决定了遍历类型
- 二叉树本质是"度为2的树"
- 深度优先遍历包含前/中/后序遍历
- 层次遍历即广度优先遍历
结语
快速排序较为复杂,需要一定的逻辑能力。