You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.5 KiB
69 lines
1.5 KiB
6 months ago
|
=begin
|
||
|
File: preorder_traversal_iii_template.rb
|
||
|
Created Time: 2024-05-22
|
||
|
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||
|
=end
|
||
|
|
||
|
require_relative '../utils/tree_node'
|
||
|
require_relative '../utils/print_util'
|
||
|
|
||
|
### 判断当前状态是否为解 ###
|
||
|
def is_solution?(state)
|
||
|
!state.empty? && state.last.val == 7
|
||
|
end
|
||
|
|
||
|
### 记录解 ###
|
||
|
def record_solution(state, res)
|
||
|
res << state.dup
|
||
|
end
|
||
|
|
||
|
### 判断在当前状态下,该选择是否合法 ###
|
||
|
def is_valid?(state, choice)
|
||
|
choice && choice.val != 3
|
||
|
end
|
||
|
|
||
|
### 更新状态 ###
|
||
|
def make_choice(state, choice)
|
||
|
state << choice
|
||
|
end
|
||
|
|
||
|
### 恢复状态 ###
|
||
|
def undo_choice(state, choice)
|
||
|
state.pop
|
||
|
end
|
||
|
|
||
|
### 回溯算法:例题三 ###
|
||
|
def backtrack(state, choices, res)
|
||
|
# 检查是否为解
|
||
|
record_solution(state, res) if is_solution?(state)
|
||
|
|
||
|
# 遍历所有选择
|
||
|
for choice in choices
|
||
|
# 剪枝:检查选择是否合法
|
||
|
if is_valid?(state, choice)
|
||
|
# 尝试:做出选择,更新状态
|
||
|
make_choice(state, choice)
|
||
|
# 进行下一轮选择
|
||
|
backtrack(state, [choice.left, choice.right], res)
|
||
|
# 回退:撤销选择,恢复到之前的状态
|
||
|
undo_choice(state, choice)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
### Driver Code ###
|
||
|
if __FILE__ == $0
|
||
|
root = arr_to_tree([1, 7, 3, 4, 5, 6, 7])
|
||
|
puts "\n初始化二叉树"
|
||
|
print_tree(root)
|
||
|
|
||
|
# 回溯算法
|
||
|
res = []
|
||
|
backtrack([], [root], res)
|
||
|
|
||
|
puts "\n输出所有根节点到节点 7 的路径,要求路径中不包含值为 3 的节点"
|
||
|
for path in res
|
||
|
p path.map { |node| node.val }
|
||
|
end
|
||
|
end
|