数据结构 二叉树理论、递归理论与快速排序理论 6.19
前言
由于今天的理论内容及其之多,加上自己希望早点睡觉,所以今天的博客将主要讲述理论,具体的代码实现会放在明天的博客中。
概述
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的树"
- 深度优先遍历包含前/中/后序遍历
- 层次遍历即广度优先遍历
结语
快速排序较为复杂,需要一定的逻辑能力。