首页
学习
活动
专区
圈层
工具
发布

接着讲递归遍历

递归遍历 递归的另一个重要应用是递归遍历。 想象一下,我们有一家公司。...如果我们在代码中放置3-4个嵌套的子循环来遍历单个对象,它就会变得相当丑陋。 让我们尝试递归。...或者它是一个有N个子部门的对象——然后我们可以进行N次递归调用,以得到每个子部门的和并组合结果。 第一种情况是递归的基础,这种简单的情况,当我们得到一个数组。...这就是递归的力量。它也适用于任何层次的子部门嵌套。 下面是调用的图表: ? 我们很容易看到这个原则:对于一个对象{…}子调用,而数组是递归树的“叶”,它们给出直接的结果。...循环(val of object .values(obj))以遍历对象值:object。values返回它们的数组。

73220
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    非递归遍历树

    先序非递归遍历二叉树,中序非递归遍历二叉树,后序非递归遍历二叉树及双栈法。...先序非递归遍历二叉树 先序非递归遍历比较简单,感觉与DFS类似,根据先序遍历的规则根左右,先将根节点压入栈,然后遍历左子树,再遍历左子树的左子树,一头走到NULL,把每次遍历的左子树的根节点依次入栈并把当前结点数据打印出来...Creat(a+1,b,i); T->rchild = Creat(a+i+1,b+i+1,n-i-1); return T; } } return NULL; } //先序非递归遍历...= Creat(a+1,b,i); T->rchild = Creat(a+i+1,b+i+1,n-i-1); return T; } } return NULL; } //中序遍历非递归...} return 0; } 后序非递归遍历二叉树及双栈法 单栈法 后序非递归遍历和先序中序非递归开始类似,先将左子树的左孩子的的左孩子的….每个节点压入栈。

    1.6K10

    树的遍历 Traverse a Tree

    ---- 递归的两种思路 递归是树的特性之一。许多树问题可以通过递归的方式来解决。...在树的问题中, 递归可以 “自顶向下” 或 “自底向上” 自顶向下 “自顶向下” 意味着在每个递归层级,我们将首先访问节点来计算一些值,并在递归调用函数时将这些值传递到子节点。...自底向上 “自底向上”在每个递归层次上,我们首先对所有子节点递归地调用函数,然后根据返回值和根节点本身的值得到答案。这个过程可以看作是后序遍历的一种。...总结 树的前序, 中序, 后序, 层序遍历是操作 N 叉树的基础, 关于树的算法题基本都是这种思想的扩展, 所以一定要熟练掌握 对于递归的两种解题思路, 如果你不确定是使用自顶向下或自底向上, 你可以先思考...如果答案是肯定的,那么请尝试使用 “自底向上” 的递归来解决此问题。

    1.5K20

    树的非递归遍历

    树使用递归遍历非常方便,如果将代码拉伸开来,我们能否是否非递归代码来实现呢?当然是可以的,我们只要把递归的循环步骤修改为while就可以了。...并放弃其左子树; 如果结点没有左子树,访问该结点; 步骤2: 如果结点有右子树,重复步骤1; 如果结点没有右子树(结点访问完毕),根据栈顶指示回退,访问栈顶元素,并访问右子树,重复步骤1 如果栈为空,表示遍历结束...; // 持续遍历,到没有左子树为止 while (tree->leftChild !...= nullptr) { // 该结点入栈 st.push(tree); // 并继续向下找左子树 tree = tree->leftChild; } // 返回传递进来的 tree 最深的左子树 return...tree; } void myTreeOrder(TirTNode* tree) { std::stack st; TirTNode* pLeft = findLeft(tree

    76020

    树的非递归遍历

    前序遍历 解法1: 图画的有点难看 说一下大概思路 1.借助一个栈 把root扔进栈中 2.此时栈中有一个root元素 一直判断栈为空即可 3.其次栈内先放右树元素 再放左边元素 因为栈是先进后出原理...cur走完左子树 并且加入到list中 2.左子树走完 走右子树 弹出顶部元素 并且访问它的右子树 3.外层循环 当走完右树 可能cur判空 但是栈不为空 所有得加上判空 不然栈内没出完 中序遍历...它是左子树遍历完 去右子树遍历时候 打印即可 后序遍历 在前序遍历解法一的基础上只需略微修改即可便可得到后序遍历 前序遍历是 根左右 代码写成 根 右 左 实现了前序遍历 再实现一下根右左...后序遍历是 左右根 根右左 翻转 便可得到左右根 public List postorderTraversal(TreeNode root) {...如果右子树已经被访问(即top.right == prev),这表示已经完成了对右子树的遍历,也可以访问top ​​ 可以尝试画图理解 不懂可以私信我 层序遍历 public List<List

    66010

    玩透二叉树(Binary-Tree)及前序(先序)、中序、后序【递归和非递归】遍历

    (左右根) 先序遍历 递归先序遍历 递归先序遍历很容易理解,先输出节点的值,再递归遍历左右子树。中序和后序的递归类似,改变根节点输出位置即可。...图2:非递归先序遍历 遍历过程参考注释 // 非递归先序遍历 public static void preorderTraversal(TreeNode root) { // 用来暂存节点的栈...: 递归先序遍历: 1 2 4 6 7 8 3 5 非递归先序遍历:1 2 4 6 7 8 3 5 中序遍历 递归中序遍历 过程和递归先序遍历类似 // 递归中序遍历 public static...递归中序遍历: 4 7 6 8 2 1 3 5 非递归中序遍历:4 7 6 8 2 1 3 5 后序遍历 递归后序遍历 过程和递归先序遍历类似 // 递归后序遍历 public static...node = node.right; } } } 后序遍历结果 递归后序遍历: 7 8 6 4 2 5 3 1 非递归后序遍历:7 8 6 4 2 5

    1.1K30

    Python深度遍历、广度遍历、递归函数遍历目录【详细讲解】

    Python通过os模块可以实现对文件或者目录的遍历,这里想实现这样的效果有三种方法,分别是递归函数遍历目录,栈深度遍历和队列广度遍历。下面就通过这三种方法来演练一下。...通过以下目录结构来演示 图片1.png 1.递归函数遍历目录 import os path = r'C:\Users\Administrator\Desktop\python知识总结\1.python自学网...(path, sp=''):     flist = os.listdir(path) # print(flist)     sp += '\t' for f in flist: # 遍历目录...import os path = r'C:\Users\Administrator\Desktop\python知识总结\1.python自学网-基础教程-视频源码\aaa' # 栈结构遍历又可以看做深度遍历...= 0: # 数据出队         dpath = queue.popleft() # 遍历目录中所有目录和文件,是目录继续遍历,不是目录打印出来         flist

    4.6K20

    递归遍历-LeetCode 124、112、113(递归遍历二叉树,回溯法)

    因此使用递归算法从根节点开始遍历,如果左右子树最大路径和大于0,则取出该路径的最大值,否则为零,也就是说如果大于零,则加上之后result是可以增加的!.../** * Definition for a binary tree node....解题思路: 和上一题的思路一模一样,但这一题需要我们将中间遍历的节点值保存起来,因此需要一个tmp数组来保存我们遍历过的节点!...这里面需要注意的一点就是回溯法的使用,当修改了一个状态之后,递归结束后,需要把这个状态重新置为之前的状态。 比如tmp中push_back了一个值,当递归结束进行回溯阶段,需要pop_back()。.../** * Definition for a binary tree node.

    1.2K70

    二叉树的非递归遍历(递归和非递归)

    对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是 递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。...在三种遍历中, 前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历    前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。  ...       后序遍历的非递归实现是三种遍历方式中最难的一种。...处理 #include  void layerOrder(BTree *tree)   {   if (tree == NULL)   return;       queue q;       q.push(tree);       BTree *p = NULL;   while (!

    2.3K100

    递归的妙用—遍历子控件

    我们在ASP.NET编程中, 经常需要遍历一个Web控件的子控件 ,找到所需的控件并获取控件中相应的值。...以前我都是采用循环的方式遍历子控件,但当子控件是复杂的树形结构,比如:子控件也有子控件,子控件的子控件也有子控件。...既然子控件表现为一个树形结构,为什么我不用递归去遍历子控件?当我看着不太优雅的嵌套循环代码时,我突然这样想到。使用递归,根本不用关心所需的控件在哪一层,而且代码简洁。     ...下面就是两种遍历方式: 1、循环方式: for (int i =0; i<GlobalCategoryPanel.Controls.Count;i++)//GlobalCategoryPanel是个Panel...FindSelecedControl(GlobalCategoryPanel);         }         private void FindSelecedControl(Control control)//递归函数

    1.1K20

    数据结构——二叉树的非递归的前序遍历&&中序遍历&&后序非递归遍历

    二叉树的非递归前序遍历 首先创建一个栈,用于存储节点。如果根节点为空,直接返回。 定义一个当前节点cur,初始化为根节点。...、左子树依次入栈,而由于栈 “后进先出” 的特性,左子树会在下一次循环中被优先弹出并加入结果 } return result; } } 中序非递归遍历...//左边一直迭代,然后迭代到为空的时候跟前序非递归遍历是一样的 //就是根节点的打印位置变了 public class PreorderTraversal { public List<Integer...直接找到上一个节点然后进行打印根节点没然后再去走右边的子树 System.out.print(top.val + " "); cur = top.right; } 后续非递归遍历...,此时可以访问当前节点; 否则,需要先去遍历右子树(将 cur 指向右子树,继续入栈处理)。

    28310

    C++版 - Leetcode 94:Binary Tree Inorder Traversal (二叉树中序遍历,非递归)

    Binary Tree Inorder Traversal 提交地址: https://leetcode.com/problems/binary-tree-inorder-traversal/ Total...OJ's Binary Tree Serialization: The serialization of a binary tree follows a level order traversal,...分析: 借助栈实现非递归中序遍历算法的方法如下: 1)将二叉树的根结点作为当前结点。 2)若当前结点非空,则该结点进栈并将其左孩子结点作为当前结点,重复步骤2),直到当前结点为NULL为止。...= NULL) { s.push(p); // 未到叶结点,持续往左孩子方向深处遍历 p=p->left; // 将左结点作为当前结点 } if(p == NULL...new TreeNode(3); res=sol.inorderTraversal(root); for(int i:res) cout遍历的方法

    77330

    使用 Python 实现文件递归遍历的

    今天有个脚本需要遍历获取某指定文件夹下面的所有文件,我记得很早前也实现过文件遍历和目录遍历的功能,于是找来看一看,嘿,不看不知道,看了吓一跳,原来之前我竟然用了这么搓的实现。...先发出来看看: def getallfiles(dir): """遍历获取指定文件夹下面所有文件""" if os.path.isdir(dir): filelist = os.listdir...开始着手优化,方案一: def getallfiles(dir): """使用listdir循环遍历""" if not os.path.isdir(dir): print dir...网上一搜一大把,原来有一个现成的 os.walk() 函数可以用来处理文件(夹)的遍历,这样优化下就更简单了。...方案二: def getallfilesofwalk(dir): """使用listdir循环遍历""" if not os.path.isdir(dir): print dir

    3.1K20
    领券