/** * File: preorder_traversal_iii_template.cs * Created Time: 2023-04-17 * Author: hpstory (hpstory1024@163.com) */ using hello_algo.include; using NUnit.Framework; namespace hello_algo.chapter_backtracking; public class preorder_traversal_iii_template { /* 判断当前状态是否为解 */ static bool isSolution(List state) { return state.Count != 0 && state[^1].val == 7; } /* 记录解 */ static void recordSolution(List state, List> res) { res.Add(new List(state)); } /* 判断在当前状态下,该选择是否合法 */ static bool isValid(List state, TreeNode choice) { return choice != null && choice.val != 3; } /* 更新状态 */ static void makeChoice(List state, TreeNode choice) { state.Add(choice); } /* 恢复状态 */ static void undoChoice(List state, TreeNode choice) { state.RemoveAt(state.Count - 1); } /* 回溯算法:例题三 */ static void backtrack(List state, List choices, List> res) { // 检查是否为解 if (isSolution(state)) { // 记录解 recordSolution(state, res); return; } // 遍历所有选择 foreach (TreeNode choice in choices) { // 剪枝:检查选择是否合法 if (isValid(state, choice)) { // 尝试:做出选择,更新状态 makeChoice(state, choice); List nextChoices = new List() { choice.left, choice.right }; backtrack(state, nextChoices, res); // 回退:撤销选择,恢复到之前的状态 undoChoice(state, choice); } } } [Test] public void Test() { TreeNode root = TreeNode.ListToTree(new List { 1, 7, 3, 4, 5, 6, 7 }); Console.WriteLine("\n初始化二叉树"); PrintUtil.PrintTree(root); // 回溯算法 List> res = new List>(); List choices = new List() { root }; backtrack(new List(), choices, res); Console.WriteLine("\n输出所有根节点到节点 7 的路径,要求路径中不包含值为 3 的节点"); foreach (List path in res) { PrintUtil.PrintList(path.Select(p => p.val).ToList()); } } }