Recursion 总结
一提到Tree, LinkedList,Backtracking首先想到的就是递归。
Recursion总体就是一个思想,把这个recursive()方法的logic用到之后的子问题中。现问题的解可以依赖或者不依赖于子问题的解。
在recursive()中必须要做回溯边界检查或剪枝。if (node == null) return 0或者if (isValid()) {addToResult(); return;}
recursive()可以是void或者会return value.
void recursive
void recursive一种情况是会将全局变量的result传递给下一次递归,所有符合条件的解或被记录进result,通常见于backtracking问题
e.g. subsets, permutations, combination sum, generate parentheses
也有情况是不需要求解,只需要对所有子问题进行操作或者变换,此时没有result传递. e.g. invert binary tree, reverse printing LinkedList, print tree in pre/in/post order
在这种情况下,完全不用考虑现问题和子问题依赖关系以及如何处理子问题和其后续子问题的关系,只需要当做先/后对子问题进行同样的操作,然后递归返回后继续进行现有的计算,对现问题来说所有状态保持不变. 此类问题可以考虑用stack实现因为原理是压栈保存状态,处理子问题,返回现问题继续处理.
Object recursive()
Object recursive() 一般用于现问题的解依赖于子问题的解,需要先求出子问题的解然后用这个解进行下一步计算。
boolean recursive()比较特殊,一般用于backtracking对现状态所有可能情况的递归检查并合并结果.
e.g. check whether a subset with sum equal to K, valid parenthesis string, check is a number is power of ten
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步