潍坊市论坛

首页 » 分类 » 问答 » 数据结构与算法算法之递归法
TUhjnbcbe - 2021/8/16 0:06:00
北京看荨麻疹好医院 http://pf.39.net/bdfyy/bdflx/210410/8833356.html
算法--递归法适用数据结构--链表、二叉树递归法在二叉树中的应用是最广泛的,本篇就以二叉树的遍历为例子,通过简单的题目把做题的框架确定下来,有了框架和方法论,其他的题目自然也就引刃而解了。

递归算法的框架

第一步:确定递归函数的作用(以及函数的参数和返回值)我们首先要明确的就是我们声明的递归函数的作用是什么,因为递归法最重要的就是在函数内部不断的调用自身称为递归法,如果你连递归函数的作用是什么都不清楚,又怎么确定在哪里调用自身呢。第二步:确定终止条件递归函数经常遇到的事情就是栈溢出的错误,就是终止条件错误或者写的不对。第三步:确定递归公式确定每一次递归之间的关系,在这里也就会重复调用自己来实现递归的过程。凡是举例:以二叉树的前序遍历为例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.二叉树的中序遍历回顾反馈极简编程圈

感谢您的

1
查看完整版本: 数据结构与算法算法之递归法