数据结构 二叉树理论、递归理论与快速排序理论 6.19

前言

由于今天的理论内容及其之多,加上自己希望早点睡觉,所以今天的博客将主要讲述理论,具体的代码实现会放在明天的博客中。

概述

1.手写笔记

2.数据结构与算法理论

1.手写笔记

2.数据结构与算法理论

1. 树与递归算法
  • 树的定义
    树是一种递归定义的数据结构(max递归深度为4),由多个子树或森林组成。
  • 树的结构
    • 可由多个数组或森林表示
    • 核心操作基于递归实现
2. 二叉树
  • 性质

    • 第 n 层最多有 2^(n-1) 个节点
    • 完全二叉树的节点排列遵循特定规则
  • 二叉树的类型

    类型 说明
    满二叉树 所有层节点数均达最大值
    完全二叉树 除最后一层外完全填充,最后一层从左向右填充
  • 遍历方法

    复制代码
    前序遍历:根 → 左 → 右  (ABDEC)
    中序遍历:左 → 根 → 右  (DEEAC)
    后序遍历:左 → 右 → 根  (DEECA)
    层次遍历:自上而下逐层遍历
  • 创建代码

    cpp 复制代码
    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)];
  • 实现要点

    cpp 复制代码
    void func(...) {
        if(终止条件) return;
        // 执行体
        func(参数); // 递归调用
    }
4. 核心算法实现
  • 折半查找(二分查找)​

    cpp 复制代码
    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; // 找到目标
    }
  • 快速排序

    cpp 复制代码
    // 分区函数
    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);
    }
  • 插入排序

    cpp 复制代码
    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)  多项式阶

图示说明

  1. 树形结构示意图(含A/B/C节点关系)
  2. 二叉树遍历路径示意图
  3. 递归调用栈示意图

注意事项

  • 遍历本质:"第几次访问"决定了遍历类型
  • 二叉树本质是"度为2的树"
  • 深度优先遍历包含前/中/后序遍历
  • 层次遍历即广度优先遍历

结语

快速排序较为复杂,需要一定的逻辑能力。

相关推荐
三品吉他手会点灯16 小时前
STM32 VSCode 开发-C/C++的环境配置中,找不到C/C++: Edit Configurations选项
c语言·c++·vscode·stm32·单片机·嵌入式硬件·编辑器
逻辑驱动的ken17 小时前
Java高频面试考点场景题09
java·开发语言·数据库·算法·oracle·哈希算法·散列表
帅小伙―苏17 小时前
力扣42接雨水
前端·算法·leetcode
AI科技星17 小时前
精细结构常数α的几何本源:从第一性原理的求导证明、量纲分析与全域验证
算法·机器学习·数学建模·数据挖掘·量子计算
三品吉他手会点灯17 小时前
C语言学习笔记 - 1.C概述 - 本讲内容概述
c语言·笔记·学习
6Hzlia17 小时前
【Hot 100 刷题计划】 LeetCode 287. 寻找重复数 | C++ 数组判环 (快慢指针终极解法)
c++·算法·leetcode
MegaDataFlowers17 小时前
26.删除有序数组中的重复项
算法
码完就睡19 小时前
数据结构——栈和队列的相互模拟
数据结构
iiiiyu19 小时前
常用API(SimpleDateFormat类 & Calendar类 & JDK8日期 时间 日期时间 & JDK8日期(时区) )
java·大数据·开发语言·数据结构·编程语言
故事和你9119 小时前
洛谷-数据结构1-4-图的基本应用2
开发语言·数据结构·算法·深度优先·动态规划·图论