hello-algo/codes/swift/chapter_backtracking/preorder_traversal_iii_template.swift
nuomi1 561ef20462
feat: add Swift codes for backtracking_algorithm article (#480)
* fix: compile error

* fix: package define

* feat: add Swift codes for backtracking_algorithm article
2023-05-03 18:45:43 +08:00

77 lines
2.2 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* File: preorder_traversal_iii_template.swift
* Created Time: 2023-04-30
* Author: nuomi1 (nuomi1@qq.com)
*/
import utils
/* */
func isSolution(state: [TreeNode]) -> Bool {
!state.isEmpty && state.last!.val == 7
}
/* */
func recordSolution(state: [TreeNode], res: inout [[TreeNode]]) {
res.append(state)
}
/* */
func isValid(state: [TreeNode], choice: TreeNode?) -> Bool {
choice != nil && choice!.val != 3
}
/* */
func makeChoice(state: inout [TreeNode], choice: TreeNode) {
state.append(choice)
}
/* */
func undoChoice(state: inout [TreeNode], choice: TreeNode) {
state.removeLast()
}
/* */
func backtrack(state: inout [TreeNode], choices: [TreeNode], res: inout [[TreeNode]]) {
//
if isSolution(state: state) {
recordSolution(state: state, res: &res)
return
}
//
for choice in choices {
//
if isValid(state: state, choice: choice) {
//
makeChoice(state: &state, choice: choice)
//
backtrack(state: &state, choices: [choice.left, choice.right].compactMap { $0 }, res: &res)
// 退
undoChoice(state: &state, choice: choice)
}
}
}
@main
enum preorder_traversal_iii_template {
/* Driver Code */
static func main() {
let root = TreeNode.listToTree(list: [1, 7, 3, 4, 5, 6, 7])
print("\n初始化二叉树")
PrintUtil.printTree(root: root)
//
var state: [TreeNode] = []
var res: [[TreeNode]] = []
backtrack(state: &state, choices: [root].compactMap { $0 }, res: &res)
print("\n输出所有根节点到节点 7 的路径,且路径中不包含值为 3 的节点")
for path in res {
var vals: [Int] = []
for node in path {
vals.append(node.val)
}
print(vals)
}
}
}