递归算法
核心思想: 重复将问题分解为同类的子问题而解决问题的方法,其核心思想是分治策略。 使用条件: 1.需要解决的问题可以转化为一个或多个子问题来求解,而这些子问题的求解方法与原问题完全相同,只是在数量和规模上不同。 2.递归调用的次数必须是有限的。 3.必须有结束递归的条件来终止递归。 举例( LeetCode 894 ): 满二叉树是一类二叉树,其中每个结点恰好有 0 或 2 个子结点。 返回包含 N 个结点的所有可能满二叉树的列表。 答案的每个元素都是一个可能树的根结点。 答案中每个树的每个结点都必须有 node.val=0。 你可以按任何顺序返回树的最终列表。 思路 : 构造二叉树的思路是对于二叉树的每一层来说,我们都是先初始化一个根节点, 然后分别定义它的左子树和右子树,这个过程很明显可以递归实现。 本题要求构造满二叉树,也就是每一个结点它的左节点和右节点必须同时存在 或同时不存在,假设左子树有X个节点,总节点数为N,右子树则包含N - 1 - X个 节点,X数目从 1 开始,增加到N - 1 - 1 ,共计(N - 1 ) / 2 中情况 对于每一种子情况我们采取递归求解 : 结束条件 : 当N为偶数时,无法构造二叉树,返回空数组。 当N为 1 时,树只有一个节点,为了不破坏递归,同样返回一个数组,包含这个节 点 左右子树构造采用递归的方法。 # Definition for