递归算法的框架
第一步:确定递归函数的作用(以及函数的参数和返回值)我们首先要明确的就是我们声明的递归函数的作用是什么,因为递归法最重要的就是在函数内部不断的调用自身称为递归法,如果你连递归函数的作用是什么都不清楚,又怎么确定在哪里调用自身呢。第二步:确定终止条件递归函数经常遇到的事情就是栈溢出的错误,就是终止条件错误或者写的不对。第三步:确定递归公式确定每一次递归之间的关系,在这里也就会重复调用自己来实现递归的过程。凡是举例:以二叉树的前序遍历为例1、确定递归函数的作用(函数的参数和返回值)因为要打印出前序遍历节点的数值,所以参数里需要传入vector中放在节点的数值。返回值为void。代码如下:voidtreaversal(TreeNode*cur,vectorintvec)2、确定终止条件在递归的过程中,如何算是递归结束了呢,当然就是当前遍历的节点是空的,那么本曾递归结束的标志就是,如果当前遍历的这个节点是空的,就直接return.代码如下:
if(cur==NULL)return;3、确定单层递归的逻辑前序遍历是中左右的循序,所以在单层递归的逻辑,是要先取中节点的数值,代码如下:
vec.push_back(cur-val);//中traversal(cur-left,vec);//左traversal(cur-right,vec);//右单层递归的逻辑就是按照中左右的顺序来处理的,这样二叉树的前序遍历,基本就写完了,在看一下完整代码:
前序遍历:
classSolution{public:voidtraversal(TreeNode*cur,vectorintvec){if(cur==NULL)return;vec.push_back(cur-val);//中traversal(cur-left,vec);//左traversal(cur-right,vec);//右}vectorintpreorderTraversal(TreeNode*root){vectorintresult;traversal(root,result);returnresult;}};那么前序遍历写出来之后,中序和后序遍历就不难理解了,代码如下:
中序遍历:
voidtraversal(TreeNode*cur,vectorintvec){if(cur==NULL)return;traversal(cur-left,vec);//左vec.push_back(cur-val);//中traversal(cur-right,vec);//右}
后序遍历:
voidtraversal(TreeNode*cur,vectorintvec){if(cur==NULL)return;traversal(cur-left,vec);//左traversal(cur-right,vec);//右vec.push_back(cur-val);//中}此时大家可以做一做leetcode上三道题目,分别是:.二叉树的前序遍历.二叉树的后序遍历94.二叉树的中序遍历回顾反馈极简编程圈
感谢您的