递归
递归代码模板
def recursion(level, param1, param2, ...):
if level > MAX_LEVEL:
process_result
return
process(level, data...)
self.recursion(level + 1, p1, ...)
递归示例

22. 括号生成 题目练习
思路
- 通过递归解决
- 递归终止条件(左括号 和 右括号 都是n的时候)
- 当前层的处理逻辑
- 递归出所有的括号组合方式
- 左括号 < n ;递归左括号
- 右括号 < 左括号; 递归右括号
- 下探到下一层
- 当前层清理操作(可选 根据实际情况)
def generate(self, left, right, n, res):
"""
:param left:
:param right:
:param n: 配额总数
:param res:
:return:
"""
if left == right == n:
self.res_lst.append(res)
return res
if left < n:
self.generate(left+1, right, n, res + "(")
if left > right:
self.generate(left, right+1, n, res + ")")
def generateParenthesis(self, n):
"""
:param n:
:return:
"""
self.res_lst = list()
self.generate(left=0, right=0, n=n, res="")
return self.res_lst
98. 验证二叉搜索树
class Solution(object):
"""
二叉搜索树具有如下特征
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树
思路:
- 1.递归
- 2.中序遍历BST 判断元素是否递增
"""
def isValidBST1(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
def helper(node, lower=float('-inf'), upper=float('inf')):
"""
判断是否是BST
:param node:
:param lower:
:param upper:
:return:
"""
if not node:
return True
val = node.val
if val <= lower or val >= upper:
return False
if not helper(node.right, val, upper):
return False
if not helper(node.left, lower, val):
return False
return True
return helper(root)
递归使用的经验总结:
- 抵制人肉搜索
- 找最近重复性的子问题
- 数学归纳法思维