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

一、今日学习目标

攻克 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] 求解三数之和
相关推荐
devilnumber1 小时前
Java 递归算法 详解 + 核心要点 + 实战运用 + 避坑指南
java·开发语言·算法
‎ദ്ദിᵔ.˛.ᵔ₎3 小时前
双指针、滑动窗口、前缀和、二分查找 算法
算法
顾北顾3 小时前
多头注意力机制
人工智能·深度学习·算法
H178535090963 小时前
SolidWorks_基于草图的实体特征20_特征错误排查
算法·3d建模·solidworks
hujinyuan201603 小时前
2025年12月中国电子学会青少年机器人技术等级考试试卷(二级) 真题+答案
人工智能·算法·机器人
bIo7lyA8v4 小时前
算法复杂度评估的实验统计方法与可视化的技术8
算法
李老师讲编程5 小时前
中国电子学会图形化2020.12月Scratch三级考级题
算法·scratch·信息学奥赛·图形化编程·scratch素材
退休倒计时5 小时前
【每日一题】LeetCode 53. 最大子数组和 TypeScript
数据结构·算法·leetcode·typescript
旖-旎5 小时前
FloodFill(图像渲染)(1)
c++·算法·深度优先·力扣