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 treereverse printing LinkedListprint tree in pre/in/post order

在这种情况下,完全不用考虑现问题和子问题依赖关系以及如何处理子问题和其后续子问题的关系,只需要当做先/后对子问题进行同样的操作,然后递归返回后继续进行现有的计算,对现问题来说所有状态保持不变. 此类问题可以考虑用stack实现因为原理是压栈保存状态,处理子问题,返回现问题继续处理.

Object recursive()

Object recursive() 一般用于现问题的解依赖于子问题的解,需要先求出子问题的解然后用这个解进行下一步计算。

e.g. max depth of binary tree

boolean recursive()比较特殊,一般用于backtracking对现状态所有可能情况的递归检查并合并结果.

e.g. check whether a subset with sum equal to K, valid parenthesis stringcheck is a number is power of ten

 

posted @ 2018-11-08 09:44  小张的练习室  阅读(264)  评论(0编辑  收藏  举报