二叉树的递归遍历这次要说的是递归。为什么很多同学认为递归算法就是“看一眼,写下来”。主要原因是递归不系统,没有方法论。我每次写递归算法都是靠玄学写代码。代码能不能编译通过,就看运气了。本文将介绍前中后序的递归写法。有的同学可能觉得很简单,其实不然。我们需要通过简单的主题来确定方法论。有了方法论,我们以后就可以处理复杂的递归了。这里帮你确定递归算法的三要素。每次写递归的时候,按照这三个要素来写,可以保证你写出正确的递归算法!确定递归函数的参数和返回值:确定递归过程中需要处理哪些参数,然后在递归函数中加入这个参数,同时还要指定每次递归的返回值是什么,以确定的返回类型递归函数。判断终止条件:写完递归算法后,在运行时,经常会遇到栈溢出错误,即没有写终止条件或者终止条件写错了。操作系统也使用栈结构来保存每一层递归的信息,如果递归不终止,操作系统的内存栈必然会溢出。确定单层递归逻辑:确定每一层递归需要处理的信息。这里,重复调用自己实现递归的过程也会重复。好了,我们已经确认了递归的三要素,接下来我们来练习:下面以前序遍历为例:确定递归函数的参数和返回值:因为要打印出前序遍历节点的值,需要传入参数vector是放节点的值,除了这一点不需要处理任何数据,也没有返回值,所以递归函数的返回类型为void,代码为如下:voidtraversal(TreeNode*cur,vector&vec)判断终止条件:递归过程中,递归如何结束?当然,如果当前遍历的节点为空,那么这一层的递归就要结束了,所以如果当前遍历的节点为空,直接返回即可,代码如下:if(cur==NULL)return;判断单级递归的逻辑:前序遍历是中左右的顺序,所以单级递归的逻辑是先取中间节点的值,代码如下:vec.push_back(cur->val);//中遍历(cur->left,vec);//左遍历(cur->right,vec);//右单级递归的逻辑在中、左、右的顺序。这样二叉树的前序遍历就基本完成了。先看完整代码:前序遍历:classSolution{public:voidtraversal(TreeNode*cur,vector&vec){if(cur==NULL)return;vec。push_back(cur->val);//中遍历(cur->left,vec);//左遍历(cur->right,vec);//右}vectorpreorderTraversal(TreeNode*root){vector结果;遍历(根,结果);返回结果;}};前序遍历写完了,中序和后序遍历就不难理解了。代码如下:中序遍历:voidtraversal(TreeNode*cur,vector&vec){if(cur==NULL)return;traversal(cur->left,vec);//leftvec.push_back(当前->val);//中遍历(cur->right,vec);//right}后序遍历:voidtraversal(TreeNode*cur,vector&vec){if(cur==NULL)return;traversal(cur->left,vec);//左遍历(cur->right,vec);//右遍历vec.push_back(cur->val);//中}这时候可以做leetcode上的三道题,分别是:144。二叉树145的前序遍历。二叉树的后序遍历94。二叉树的中序遍历。有的同学可能会觉得前后中序遍历的递归太简单了。我们需要使用迭代方法(非递归)。别担心,我们明天将使用迭代方法。讲清楚!其他语言版本Java://前序遍历·递归·LC144_二叉树类的前序遍历解决方案{ArrayListpreOrderReverse(TreeNoderoot){ArrayListresult=newArrayList();preOrder(root,result);returnresult;}voidpreOrder(TreeNoderoot,ArrayListresult){if(root==null){return;}result.add(root.val);//注意这句话preOrder(root.left,result);preOrder(root.right,result);}}//中序遍历·递归·LC94_中序遍历二叉树类Solution{publicListinorderTraversal(TreeNoderoot){Listres=newArrayList<>();inorder(root,res);returnres;}voidinorder(TreeNoderoot,Listlist){if(root==null){return;}inorder(root.left,list);list.add(root.val);//注意这句inorder(root.right,list);}}//后序遍历·递归·后LC145_二叉树序遍历类解决方案{publicListpostorderTraversal(TreeNoderoot){Listres=newArrayList<>();postorder(root,res);returnres;}voidpostorder(TreeNoderoot,Listlist){if(root==null){return;}postorder(root.left,list);postorder(root.right,list);list.add(root.val);//注意这句话}}Python:#preorder遍历-recursion-LC144_二叉树类的前序遍历解决方案:defpreorderTraversal(self,root:TreeNode)->List[int]:#Saveresultresult=[]deftraversal(root:TreeNode):ifroot==None:returnresult.append(root.val)#前序遍历(root.left)#左遍历(root.right)#右遍历(root)returnresult#中序遍历-递归-LC94_二叉树类的中序遍历解法:definorderTraversal(self,root:TreeNode)->List[int]:result=[]deftraversal(root:TreeNode):ifroot==N一:returntraversal(root.left)#Leftresult.append(root.val)#Insequencetraversal(root.right)#Righttraversal(root)returnresult#Post-ordertraversal-recursion-LC145_二叉树类Solut的后序遍历ion:defpostorderTraversal(self,root:TreeNode)->List[int]:result=[]deftraversal(root:TreeNode):ifroot==None:returntraversal(root.left)#lefttraversal(root.right)#right结果.append(root.val)#Sequencetraversal(root)returnresult【小编推荐】教你用Python轻松打造淘宝主图视频生成神器为什么NanoID会取代UUID加密货币世界黑客防范与缓解最近腾讯在35岁员工薪资曝光,这辈子还能赶得上吗?