1、写递归的三步骤
「确定递归函数的参数和返回值:」确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
「确定终止条件:」写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。
「确定单层递归的逻辑:」确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。
2、什么时候才能有返回值
如果需要遍历整棵树,递归函数就不能有返回值。如果需要遍历某一条符合条件的路径,递归函数就一定要有返回值,因为遇到符合条件的路径就要及时返回。
如果递归函数有返回值,如何区分要搜索一条边还是搜索整棵树呢?
搜索一条边的写法:
if(递归函数(root.left)) return;
if(递归函数(root.right)) return;
//另一种形式
left = 递归函数(root.left);
if(left) return;
right = 递归函数(root.right);
if(right) return;
搜索整棵树的写法:
left = 递归函数(root.left);
right = 递归函数(root.right);
left与right的逻辑处理
在递归函数有返回值的情况下:如果要搜索一条边,递归函数返回值不为空 的时候,立刻返回;如果要搜索整棵树,直接用一个变量left、变量right接住返回值,这个left、right后续还有逻辑处理的需要,也就是后序遍历中处理中间结点的逻辑(也是回溯)。
3、对于一般二叉树,递归过程中还有回溯的过程,例如走一个左方向的分支走到头了,那么还要掉头,再走右分支。但对于二叉搜索树,不需要回溯的过程,因为结点的有序性就帮我们确定了搜索的方向