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

一、今日学习目标

攻克 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] 求解三数之和
相关推荐
阿里技术9 分钟前
Agent 评测:方法论与体系设计
大数据·人工智能·算法
cxr82832 分钟前
大语言模型上下文缓存命中率测试全场景清单
人工智能·python·算法·缓存·语言模型·自然语言处理·llm
noipp43 分钟前
推荐题目:洛谷 P13554 【MX-X15-T1】奶龙龙
c语言·数据结构·c++·算法·编程·洛谷
念风1 小时前
一阶低通滤波器系数的两种计算方法
算法
geovindu1 小时前
go: Enumeration Algorithm
开发语言·后端·算法·golang·枚举算法
退休倒计时2 小时前
【每日一题】LeetCode 287. 寻找重复数 TypeScript
算法·leetcode·typescript
奋发向前wcx2 小时前
y1,y2总复习笔记2 2026.7.15
java·笔记·算法
AI科技星2 小时前
《全域数学·工程应用大典》113–200讲完整总目录
数据结构·人工智能·算法·机器学习·线性回归·乖乖数学·全域数学
ttod_qzstudio2 小时前
【软考算法】软件设计师下午第四题算法总纲:从“直接放弃“到“稳稳拿分“
算法·软考
广州灵眸科技有限公司3 小时前
xfce桌面旋转说明:基于灵眸科技EASY-EAI-Nano-TB
网络·网络协议·tcp/ip·算法·php