算法进阶:二叉树翻转与环形链表解析

一、今日学习目标

攻克 4 道进阶必考题,衔接最终复盘:

  1. 二叉树翻转(镜像二叉树)
  2. 判断环形链表(快慢指针)
  3. 三数之和(双指针经典)
  4. 子集问题(回溯入门模板)

1. 翻转二叉树(二叉树经典)

思路

递归交换当前节点的左右子树,自上而下翻转。

复制代码
#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
}TreeNode;

TreeNode* invertTree(TreeNode* root) {
    if(root == NULL) return NULL;
    // 交换左右孩子
    TreeNode* temp = root->left;
    root->left = root->right;
    root->right = temp;

    invertTree(root->left);
    invertTree(root->right);
    return root;
}

2. 环形链表(快慢指针)

核心原理

慢指针走 1 步,快指针走 2 步;若有环,快慢指针一定会相遇;无环则快指针先走到末尾。

复制代码
typedef struct ListNode {
    int val;
    struct ListNode *next;
}ListNode;

int hasCycle(ListNode *head) {
    ListNode *slow = head;
    ListNode *fast = head;
    while(fast != NULL && fast->next != NULL)
    {
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast)
            return 1;  // 有环
    }
    return 0; // 无环
}

3. 三数之和(双指针 + 排序)

题意

给定数组,找出所有满足 a+b+c=0 的三元组。

思路

  1. 数组排序

  2. 固定第一个数,左右双指针向内收缩

  3. 去重处理,避免重复结果

    void threeSum(int nums[], int n)
    {
    // 简易冒泡排序
    for(int i = 0; i < n-1; i++)
    for(int j = 0; j < n-i-1; j++)
    if(nums[j] > nums[j+1])
    {
    int t = nums[j];
    nums[j] = nums[j+1];
    nums[j+1] = t;
    }

    复制代码
     for(int i = 0; i < n; i++)
     {
         int l = i + 1;
         int r = n - 1;
         int target = -nums[i];
         while(l < r)
         {
             int sum = nums[l] + nums[r];
             if(sum == target)
             {
                 printf("%d %d %d\n",nums[i],nums[l],nums[r]);
                 l++;r--;
             }
             else if(sum < target) l++;
             else r--;
         }
     }

    }


4. 子集问题(回溯算法模板)

题意

输出数组所有子集,回溯经典入门。

复制代码
int res[100][100];
int path[100];
int resSize = 0;

void backtrack(int nums[], int n, int start, int pathLen)
{
    // 记录当前子集
    for(int i = 0; i < pathLen; i++)
        res[resSize][i] = path[i];
    resSize++;

    for(int i = start; i < n; i++)
    {
        // 做选择
        path[pathLen] = nums[i];
        // 递归
        backtrack(nums, n, i+1, pathLen+1);
        // 撤销选择
    }
}

void subsets(int nums[], int n)
{
    resSize = 0;
    backtrack(nums,n,0,0);
    // 打印所有子集
    for(int i = 0; i < resSize; i++)
    {
        for(int j = 0; res[i][j]!=0; j++)
            printf("%d ",res[i][j]);
        printf("\n");
    }
}

二、核心考点总结

  1. 翻转二叉树:递归交换,二叉树基础操作,面试手写题
  2. 环形链表:快慢指针思想,链表判环、找中点通用
  3. 三数之和:排序 + 双指针,优化暴力三重循环
  4. 子集回溯:回溯万能模板,排列、组合、子集通用

三、今日小练习

  1. 构建一棵简单二叉树,使用代码完成镜像翻转
  2. 手动模拟快慢指针,理解环形链表判定逻辑
  3. 数组 [-1,0,1,2,-1,-4] 求解三数之和
相关推荐
铮铭19 小时前
【论文阅读】世界模型发展脉络整理---Understanding World or Predicting Future? A Comprehensive Survey of World Models
论文阅读·人工智能·算法·机器人
灵智实验室19 小时前
PX4状态估计技术EKF2详解(四):EKF2 Output Predictor——从延迟估计到实时输出
算法·无人机·px 4
科研小白_19 小时前
【MATLAB点云处理基础】基于区域生长算法的桥墩面域点云分割
算法
paeamecium19 小时前
【PAT甲级真题】- Shuffling Machine (20)
c++·算法·pat考试·pat
m0_7375393720 小时前
pod Scheduler调度
算法·贪心算法
此生决int20 小时前
算法从入门到精通——双指针
算法
普马萨特20 小时前
Uber H3:地理网格索引在空间数据分析中的应用
数据结构·算法
alphaTao20 小时前
LeetCode 每日一题 2026/5/11-2026/5/17
算法·leetcode
洛水水20 小时前
【力扣100题】45.零钱兑换
算法·leetcode·职场和发展
Aaron158820 小时前
全频段 SDR干扰源模块解决方案(星链干扰、LORA无人机干扰)
人工智能·算法·fpga开发·硬件架构·硬件工程·无人机·信息与通信