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

一、今日学习目标

攻克 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] 求解三数之和
相关推荐
Queenie_Charlie2 小时前
关于二叉树(2)
数据结构·c++·二叉树·简单树结构
:1212 小时前
java数组2
java·算法·排序算法
代码飞天2 小时前
算法与数据结构之树——让数据查找更加迅速
数据结构·算法
贾斯汀玛尔斯2 小时前
每天学一个算法--外部排序(External Sorting)
算法
故事和你912 小时前
洛谷-算法2-2-常见优化技巧1
开发语言·数据结构·c++·算法·动态规划·图论
酉鬼女又兒2 小时前
JavaLeetCode 第一题「两数之和」:从暴力枚举到一遍哈希表的正确与错误实现,详解HashMap核心知识点及常见陷阱
java·开发语言·数据结构·算法·leetcode·职场和发展·散列表
黎阳之光2 小时前
视频孪生重构轨交数字孪生新范式|黎阳之光以自主核心技术破解落地难题
大数据·人工智能·算法·安全·数字孪生
云淡风轻~窗明几净2 小时前
关于TSP的sealine算法与角谷猜想(2026-04-25)
数据结构·人工智能·算法·动态规划·模拟退火算法
wayz112 小时前
Day 13:朴素贝叶斯分类器
人工智能·算法·机器学习·朴素贝叶斯