一、今日学习目标
攻克 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 的三元组。
思路
-
数组排序
-
固定第一个数,左右双指针向内收缩
-
去重处理,避免重复结果
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,0,1,2,-1,-4]求解三数之和