回溯实验室:用 C++ 看清搜索树的选择、返回与撤销
回溯实验室:用 C++ 看清搜索树的选择、返回与撤销
October 4, 2026
回溯学习从一个具体问题开始:递归返回以后,下一条分支到底从什么状态继续?
动画从算法实际运行生成。可以播放、暂停、前后单步、拖动进度,也能跳到下一次返回或下一条答案。每步同步显示搜索树节点、当前调用链、path、递归深度、约束变量、已收集答案与对应C++代码行。
学习路线
| 顺序 | 题目 | 核心问题 |
|---|---|---|
| 01 | 生成长度3的01串 | 000到001之间发生了哪些返回与撤销? |
| 02–03 | LC78子集、LC77组合 | 在每个节点收集,还是到固定长度才收集? |
| 04 | LC46全排列 | 为什么每层都扫描全部下标,还要恢复used? |
| 05–06 | LC90子集II、LC47全排列II | 同层去重为什么不阻止同一路径选两个相同值? |
| 07–08 | LC39组合总和、LC40组合总和II | 从i还是i+1继续?为什么能够提前剪枝? |
| 09 | LC131分割回文串 | 一段是否合法与整棵树怎样遍历,分别由谁负责? |
| 10 | LC79单词搜索 | 失败分支如何恢复visited?成功又怎样向上传递? |
| 11 | LC132分割回文串II | 为什么求最优值不必列出全部方案? |
重点案例:分割aabbaa
示例包含单字符、aa、bb、abba和整个字符串等不同长度的回文段,共10种合法切分。完整动画保留非回文候选被拒绝的步骤,而不只展示成功路径。
可以修改输入为1–8个小写字母,重新生成搜索树,比较不同字符串带来的分支。默认完整代码以aabbaa运行;改动动画输入后,也请修改C++的main输入。
每课都有具体例子、逐步过程、变量释义、可运行C++17练习骨架、分层提示、完整代码、搜索规模分析和过关问题。先独立尝试,再展开参考代码;看过动画不等于已经独立掌握。