首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

2020-08-26:裸写算法:树的非递归先序遍历。

福哥答案2020-08-26: 方法 1:迭代 算法 从根节点开始,每次迭代弹出当前栈顶元素,并将其孩子节点压入栈中,先压右孩子再压左孩子。...算法不会使用额外空间,只需要保存最终的输出结果。如果实时输出结果,那么空间复杂度是 O(1)。 算法 算法的思路是从当前节点向下访问先序遍历的前驱节点,每个前驱节点都恰好被访问两次。...首先从当前节点开始,向左孩子走一步然后沿着右孩子一直向下访问,直到到达一个叶子节点(当前节点的中序遍历前驱节点),所以我们更新输出并建立一条伪边 predecessor.Right = root 更新这个前驱的下一个点...Val int Left *TreeNode Right *TreeNode } //方法 1:迭代 //从根节点开始,每次迭代弹出当前栈顶元素,并将其孩子节点压入栈中,先压右孩子再压左孩子...算法不会使用额外空间,只需要保存最终的输出结果。如果实时输出结果,那么空间复杂度是 O(1)。 //算法 //算法的思路是从当前节点向下访问先序遍历的前驱节点,每个前驱节点都恰好被访问两次。

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

    二叉树中序遍历(非递归)算法实现–C语言「建议收藏」

    昨天写了一遍二叉树的先序遍历(非递归)算法,今天写一下二叉树的二叉树的中序遍历(非递归)算法。...中序遍历的非递归算法有两种,但是个人觉得只要掌握一种就可以了,只要自己的逻辑清晰,会哪一种又有什么关系呢~ 首先给出今天的二叉树的示例图: 代码如下: #include "stdafx.h" #include...} printf("\n"); return 1; } int main(int argc, char* argv[]) { BiTree T = NULL; printf("请输入二叉树-按照先序序列建立二叉树...\n"); CreateBiTree(T); printf("中序遍历二叉树结果为:\n"); InOrderTraverse(T); return 0; } 测试结果: 代码相对于先序遍历来说...对于C语言,自己可能还是刚入门阶段,但是不去多练习,又怎么会有提高呢!就像做数学题一样,自己觉得看着都会,却又不去动手去做,那在真正考试的时候,很可能的结果就是大部分题目都做不出来。

    82520

    二叉树的遍历:先序中序后序遍历的递归与非递归实现及层序遍历

    先序遍历   在先序遍历中,对节点的访问工作是在它的左右儿子被访问之前进行的。换言之,先序遍历访问节点的顺序是根节点-左儿子-右儿子。...尾递归的递归调用需要用栈存储调用的信息,当数据规模较大时容易越出栈空间。虽然现在大部分的编译器能够自动去除尾递归,但是即使如此,我们不妨自己去除。非递归先序遍历算法基本思路:使用堆栈   a....中序遍历   中序遍历的遍历路径与先序遍历完全一样。其实现的思路也与先序遍历非常相似。...: 试设计一个非递归算法,按中根顺序遍历非线索二叉树,但不得用任何辅助栈。...递归实现思路与中序遍历和先序遍历相似,代码如下: void PostOrderTraversal(BinTree BT) { if (BT) { PostOrderTraversal

    1.5K60

    玩透二叉树(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

    73830

    二叉树构建,先序,中序,后序遍历(以及非递归实现),广度优先遍历

    举一个反例即可证明根据扩充二叉树的中序遍历序列是不能唯一确定二叉树的结构,以文档中的描述为例: image.png 上图中扩展二叉树的中序遍历序列为:#B#D#A#C#,那么也可以对应为下面的扩展二叉树...建立二叉链表的递归算法如下: //先序创建二叉树 void CreatBTree(BTNode *&root) { char nValue = 0; cin >>...在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。下面一一讲解具体的递归和非递归实现。...//先根非递归遍历,需要使用栈 void preOrderStack(BinaryTreeNode* root){ if(root==NULL) return; stack...+中序构建二叉树可以用非递归的方法来实现,等等,鄙人后续会继续完善的。

    20.2K56

    C语言快速排序(非递归)图文详解

    前言:   上一期分析了快速排序的三种写法,这三种写法有一个相同点,都是采用递归形式来实现的,那么有没有非递归的方法实现呢?...答案是当然有,用非递归的方法实现快速排序,其实可以借助数据结构中的栈来模拟实现递归的过程。...思路图分析:   因为使用c语言写的,所以需要我们自己写一个栈,栈的实现我这里不再过多赘述,我会把栈的码放在最后。假如我们现在有下面这组数组,我们要对它进行排序。...根据栈的性质后入先出,所以我们让5-8出栈: 跟上面一样,每次出栈对相应区间进行一次部分排序,排序完如下图: 因为在对这个区间进行部分排序时,67被选为key,此时67的右边已经全部比他大,所以排完序后不变...现在就不难感受出,这其实是在模拟递归的过程。

    21610

    二叉树非递归版的中序遍历算法

    树的递归遍历算法很容易理解,代码也很精简,但是如果想要从本质上理解二叉树常用的三种遍历方法,还得要思考树的非递归遍历算法。...读完后的收获: 您将学到二叉树的中序遍历的非递归版本 明白栈这种数据结构该怎么使用 02 — 讨论的问题是什么? 主要讨论二叉树的非递归版中序遍历该如何实现,包括借助什么样的数据结构,迭代的思路等。...中序遍历 Inorder Traversal 访问根结点的操作发生在遍历其左、右子树之中间。 04 — 非递归版中序遍历算法 这里我们以二叉树为例,讨论二叉树的中序遍历的非递归版实现。...05 — 评价算法 非递归版中序遍历算法的时间复杂度为 O(n),空间复杂度为栈所占的内存空间为 O(n)。...06 — 总结 讨论了二叉树的非递归版中序遍历算法,算法借助栈,巧妙地对每个叶子节点虚拟出一个子右节点,按照左子树,根节点,右子树的遍历次序访问整棵树,时间和空间复杂度都为 O(n)。

    1.2K50

    二叉树的基本操作(C 语言版)包含递归和非递归算法

    二叉树的基本操作(C 语言版) 1 二叉树的定义 二叉树是每个结点最多有两个子树的树结构,常被用于实现二叉查找树和二叉堆。二叉树是链式存储结构,用的是二叉链,本质上是链表。...引入辅助栈 //先序遍历二叉树:非递归实现 void PreOrderTraverseNonRec(BiTree root) { BiTree stack[MaxSize]; BiTree p;...(root->lchild); PreOrderTraverse(root->rchild); } } //先序遍历二叉树:非递归实现 void PreOrderTraverseNonRec...0 //BiTree root; //CreateTree(&root); BiTree root = NULL; root = CreateTree();//创建树 printf("先序非递归遍历...printf("\n后序非递归遍历:"); PostOrderTraverseNonRec(root); printf("\n先序递归遍历:"); PreOrderTraverse(root

    3.9K51

    C语言函数递归_c语言递归举例

    今天说一说C语言函数递归_c语言递归举例,希望能够帮助大家进步!!! 文章目录 函数递归 什么是递归?...第一次接触递归都会很懵,慢慢理解这个过程就明白了。 什么是递归? 递归做为一种算法在程序设计语言中广泛应用。...栈溢出(Stack Overflow) 关于栈溢出,我就先简单介绍一下栈 栈:栈是一种计算机系统中的数据结构,它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据...那如何解决上述的问题: 将递归改写成非递归。 使用static对象替代 nonstatic 局部对象。...,这只是因为它比非递归的形式更为清晰。

    13.7K32
    领券