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

树的非递归遍历

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

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

    非递归遍历树

    先序非递归遍历二叉树,中序非递归遍历二叉树,后序非递归遍历二叉树及双栈法。...先序非递归遍历二叉树 先序非递归遍历比较简单,感觉与DFS类似,根据先序遍历的规则根左右,先将根节点压入栈,然后遍历左子树,再遍历左子树的左子树,一头走到NULL,把每次遍历的左子树的根节点依次入栈并把当前结点数据打印出来...//测试样例 //输入前三行 //9 //1 2 4 7 3 5 8 9 6 //先序 //4 7 2 1 8 5 9 3 6 // 中序 //7 4 2 8 9 5 6 3 1 // 后序 中序非递归遍历二叉树...i<n;++i) { scanf("%d",&b[i]); } Tree = Creat(a,b,n); travel_in(Tree); } return 0; } 后序非递归遍历二叉树及双栈法...单栈法 后序非递归遍历和先序中序非递归开始类似,先将左子树的左孩子的的左孩子的….每个节点压入栈。

    1.6K10

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

    二 叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。...因为树的定义本身就是 递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。...在三种遍历中, 前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历    前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。  ...,访问该栈顶结点,然后将当前的P置为栈顶结点的右孩子;   3)直到P为NULL并且栈为空则遍历结束 //非递归中序遍历  void in_order(BTree *root)        {  ...       后序遍历的非递归实现是三种遍历方式中最难的一种。

    2.3K100

    二叉树的递归遍历

    先强调一下,本篇博客,对知晓一点二叉树的人会更友好 1、基础 二叉树的遍历方式,分为深度优先遍历与广度优先遍历 深度优先遍历 前序遍历(递归法,迭代法) – 中 左 右 中序遍历(递归法,迭代法) –...左 中 右 后序遍历(递归法,迭代法) – 左 右 中 广度优先遍历 层次遍历(迭代法) 以上描述的是,各种遍历方式 2、递归遍历 递归方法 说到递归,想写好,要记清楚几个点 1....确定单层递归的逻辑(哪些需进行递归) 如何用递归进行遍历 好了,上代码 class TreeNode { // 先手写一个节点 int val; TreeNode *left...与返回遍历后的数据 vector preorderTraversal(TreeNode* root) { vector result; Traversal...(root,result); return result; // 返回遍历后的数据 } 以上为前序遍历 中序遍历与后续遍历 只需要改动以上一段代码的顺序 /

    25410

    二叉树的递归遍历

    特点1 虽然是从root开始,但是 严重依赖从下到上的反馈的数据 ,例如求tree的高度 题目1 最近公共祖先(LCA) 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。...百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”...Balanced Binary Tree 依赖下面反馈 合并在一起 特点2 从上到下,依赖当前root节点判断 1 翻转等价二叉树 我们可以为二叉树 T 定义一个翻转操作,如下所示:选择任意节点,然后交换它的左子树和右子树...只要经过一定次数的翻转操作后,能使 X 等于 Y,我们就称二叉树 X 翻转等价于二叉树 Y。 编写一个判断两个二叉树是否是翻转等价的函数。...这些树由根节点 root1 和 root2 给出 选择任意节点,然后交换它的左子树和右子树 左子树和右子树是否继续交换呢? 是否选择了任意节点?

    91520

    二叉树的遍历——递归和非递归

    二 叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。...因为树的定义本身就是 递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。...在三种遍历中, 前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历    前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。  ...        后序遍历的非递归实现是三种遍历方式中最难的一种。...若存在,则由x带回完整值并返回真,否则返回假 该算法类似于前序遍历,若树为空则返回false结束递归,若树根结点的值就等于x的值,则把结点值赋给x后返回true结束递归,否则先向左子树查找,若找到则返回

    1.8K80

    JavaScript 递归遍历json串获取相关数据

    递归遍历json串获取相关数据 1....需求1 获取菜单“路由”信息: 获取每级菜单的url,name,icon, id, requireAuth字段信息,构成节点,以及其子菜单对应字段的信息,构成子节点,要求: 如果本级菜单url为空,则不记录该级菜单相关的信息...,此时,如果其子菜单url不为空,则要记录其子菜单相关字段的信息,并向上查找离该子菜单最近,并且url不为空的菜单信息,并把该菜单信息当做其父节点,形如以下 [{path:"/home ", name:...].children.length >= 1) { getMenuRoutes(menuList[i].children, parent) } } if (JSON.stringify...需求2 获取每级菜单的url,name,icon, id, requireAuth字段信息,构成一级节点,要求: 如果级菜单url为空,则不记录该级菜单相关的信息 编码 function getMenuRoutes

    4.3K00

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

    二叉树也是常用的数据结构,通过使用二叉树可以快速的对数据进行排序或者查找,在常用的堆排序算法中,堆的底层实质就是一个模拟的完全二叉树!等等,什么是完全二叉树?二叉树又是什么?有哪几类?...,对其进行中序遍历后,会得到一个有序的列表,这是我们经常用到的一种数的结构 平衡二叉树:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,并且满足二叉搜索树的规则...满二叉搜索树 二叉树的遍历 ? 二叉树的遍历有三种方式:先序遍历,中序遍历,后序遍历。思路很简单,这里面说的顺序的序是指每个子树根节点的遍历(打印)顺序。...递归版本(先、中、后序) 递归版的遍历算法很简单了,我们只需要改变打印次序就好了,也没有什么可讲的!...(先、中、后序) 首先我们要清楚,任何算法的递归版本都可以改成非递归版本,因为函数递归调用其实质就是压栈的过程,那么我们完全可以使用堆栈来模拟这个过程!

    1.4K30

    二叉树的遍历 → 不用递归,还能遍历吗

    左子树 -> 右子树 -> 根(父)节点   广度遍历也指层次遍历,从下至上或从下至上一层一层的从左至右遍历   基于上图中的二叉树,我们来看看各种遍历的结果   先序遍历:a b q w t u c...,实现如下   中续遍历   递归实现   非递归实现   这个可能没那么好理解,结合具体的二叉树示例,脑中逐行模拟下代码执行,慢慢的就有感觉了   后续遍历   递归实现   非递归实现   ...用到了双栈,大家仔细揣摩下代码   深度优先遍历   指的就是先序遍历,前面已经实现过,这里就不再赘述 广度遍历   一层一层的遍历二叉树,如果未明确指明,都是从左至右遍历   广度遍历不满足递归的条件...广度优先遍历     指的就是从上至下层次遍历,不再赘述 总结   1、递归的实现往往比迭代实现要简单,也更好理解,但两者存在控件使用率的差异     递归没有我们想象的那么简单,不同的问题有不同的决策过程...    而如何正确的找到决策过程,没有答案,全凭个人的感觉,可以通过多练题来提高这种感觉   2、二叉树遍历是解决二叉树相关问题的基础,不同的遍历可以解决不同的问题     下一篇讲二叉树相关的具体案例

    92440

    二叉树的非递归遍历

    二叉树的非递归遍历          二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的...对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。...在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历    前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。   ...       后序遍历的非递归实现是三种遍历方式中最难的一种。...=NULL) s.push(cur->lchild); } } }  四.整个程序完整的代码 /*二叉树的遍历* 2011.8.25

    1.3K10

    二叉树的遍历(递归And迭代)

    二叉树的遍历 以 1 二叉树为例讲解: ​ 2 3 4 5 6 7 递归法 思路: 按照递归调用的机制,我们按照只要遍历到就打印的方式得到的数据为: ​ 【1,2,4,4...,4,2,5,5,5,2,1,3,6,6,6,3,7,7,7,3,1】 前序遍历 ​ 我们将前序遍历所得到的数据都是在调用递归机制的元素首次出现的位置,那么按照前序遍历:【中 - 左 - 右】的顺序即可完成...= null){ this.right.prefix(); } } 中序遍历 ​ 中序遍历所得到的数据都是在调用递归机制的元素第二次出现的位置,那么按照前序遍历:【左 - 中 -...= null){ this.right.infix(); } } 后序遍历 ​ 后序遍历所得到的数据都是在调用递归机制的元素最后一次出现的位置,那么按照前序遍历:【左 - 右 -...: 每一次递归调用都会把函数的局部变量、参数和返回值等都压入调用栈,然后在结束本层递归操作的时候,从栈顶弹出上一次递归的各项参数,这也是为什么递归可以返回上一层位置的原因。 ​

    40910

    二叉树的非递归遍历

    代码演示 stack.h里面的代码: #pragma once #include #include #define MAX 1024 //这里的栈已经知道数组的最大长度...,因此不需要再用在堆区再次开辟一块内存来用二级指针指向 struct sStack { //因为不确定用户数据类型,所以用void*指针来接收用户输入的数据地址 //指针数组----里面存放的是地址或者指针...void* data[MAX]; int size; }; //隐藏数据,不让用户能够得到操作结构体的接口 //类似c++类中的private属性 typedef void* seqStack;...main.cpp #define _CRT_SECURE_NO_WARNINGS #include #include #include"stack.h" //二叉树的非递归遍历...struct BinaryNode { //数据域 char ch; //指针域 BinaryNode* lchild; //指向左孩子的指针 BinaryNode* rchild; //指向右孩子的指针

    77110

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

    【LeetCode #124 二叉树的最大路径和】 给定一个非空二叉树,返回其最大路径和。 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。...示例 1: 输入: [1,2,3] 1 / \ 2 3 输出: 6 解题思路: 我们从根节点开始递归,最大值的路径和可能出现在左子树,右子树以及包含根节点的左右子树三种情况...因此使用递归算法从根节点开始遍历,如果左右子树最大路径和大于0,则取出该路径的最大值,否则为零,也就是说如果大于零,则加上之后result是可以增加的!...解题思路: 和上一题的思路一模一样,但这一题需要我们将中间遍历的节点值保存起来,因此需要一个tmp数组来保存我们遍历过的节点!...这里面需要注意的一点就是回溯法的使用,当修改了一个状态之后,递归结束后,需要把这个状态重新置为之前的状态。 比如tmp中push_back了一个值,当递归结束进行回溯阶段,需要pop_back()。

    1.2K70
    领券