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

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

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

82520

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

,中序遍历,后序遍历,层序遍历四种方式,下面一一介绍。   ...尾递归的递归调用需要用栈存储调用的信息,当数据规模较大时容易越出栈空间。虽然现在大部分的编译器能够自动去除尾递归,但是即使如此,我们不妨自己去除。非递归先序遍历算法基本思路:使用堆栈   a....中序遍历   中序遍历的遍历路径与先序遍历完全一样。其实现的思路也与先序遍历非常相似。...printf("%d\n", T->Data); //(访问) 打印结点    T = T->Right; //转向右子树   }   } } 非递归不用辅助栈实现中序遍历...: 试设计一个非递归算法,按中根顺序遍历非线索二叉树,但不得用任何辅助栈。

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

    二叉树—层序、前序中序后序(递归、非递归)遍历详解

    但是排序遍历也是比较重要的一环。所以笔者将前中后序.和层序遍历梳理一遍。 了解树的遍历,需要具有的只是储备有队列,递归,和栈。这里笔者都有进行过详细介绍,可以关注笔者数据结构与算法专栏。...三序遍历只是利用了递归中的来回过程中不同片段截取输出,而达到前(中、后序遍历的结果)。 前序递归 前序的规则就是根结点 ---> 左子树 ---> 右子树.我们在调用递归前进行节点操作。...有了前序的经验,我们就很好利用递归实现中序遍历。...非递归中序和前序有所区别。...= null) { t2 = t2.left; q1.push(t2); } } } } 非递归后序※ 非递归后序遍历有两种方法 一种方法是利用和前面中序

    4.8K10

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

    举一个反例即可证明根据扩充二叉树的中序遍历序列是不能唯一确定二叉树的结构,以文档中的描述为例: image.png 上图中扩展二叉树的中序遍历序列为:#B#D#A#C#,那么也可以对应为下面的扩展二叉树...: image.png 2.1前序+中序序列构建二叉树(递归实现) 构建过程: (1)前序遍历序列中的第一个数字为根节点,构造根节点; (2)找到根节点在中序遍历序列中的位置,中序中根节点左右两边分别为左子树和有子树...在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。下面一一讲解具体的递归和非递归实现。...后序遍历的非递归实现是三种遍历方式中最难的一种。...中序构建二叉树可以用非递归的方法来实现,等等,鄙人后续会继续完善的。

    20.1K56

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

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

    1.2K50

    前序、中序、后续遍历二叉树的非递归实现

    昨天发了前序、中序、后序遍历二叉树通用公式这篇文章 转发到一个号称人均leetcode100道题的群之后 受到了如下鄙视 ?...但是技不如人,我也没办法刷到平均数 那就发一版非递归版的,接着搬砖努力吧 ?...对于遍历二叉树这种数据结构,最直觉的思路就是使用递归或者栈进行辅助 节点出栈的顺序即为遍历的顺序 以下三种算法均基于栈这种数据结构实现 1....中序遍历 2.1 思路 中序遍历的规则是“左中右” 即先遍历左边的,再中间(当前节点),最后右边的 所以最先拿的数据应该是最左边的节点 a、先将根节点压入栈 b、判断栈顶元素是否存在左节点,如果存在,则压入栈...至此,中序遍历完成 2.3 代码实现 public List inorderTraversal(TreeNode root) { List result =

    91740

    二叉树的前序、中序、后序遍历 非递归解法

    数据结构二叉树遍历基础,递归解法在很早之前的博客就以C语言的形式总结了,这篇博文聚焦非递归解法。...二叉树的前序、中序、后序遍历都可以借助栈来实现,因为递归本质也是靠栈来实现的,中序遍历还有一种比较难想的镜像法。 前序遍历 leetcode 144....= null) { stack.push(cur.left); } } return res; } } 中序遍历...Binary Tree Inorder Traversal 维护一个cur指针和栈,cur指针指向当前处理的节点,栈中存将要处理的节点,二者任意为空结束循环。...Binary Tree Postorder Traversal 直接使用栈,入栈顺序先左子树后右子树(跟前序遍历相反,想一想为什么),逆序加入结果集(想一想为什么)。

    68240

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

    非递归遍历树

    先序非递归遍历二叉树,中序非递归遍历二叉树,后序非递归遍历二叉树及双栈法。...先序非递归遍历二叉树 先序非递归遍历比较简单,感觉与DFS类似,根据先序遍历的规则根左右,先将根节点压入栈,然后遍历左子树,再遍历左子树的左子树,一头走到NULL,把每次遍历的左子树的根节点依次入栈并把当前结点数据打印出来...//4 7 2 1 8 5 9 3 6 // 中序 //7 4 2 8 9 5 6 3 1 // 后序 中序非递归遍历二叉树 仔细看代码你会发现,先序遍历和中序遍历代码差不多,关键在于打印节点数据的位置不一样...lchild = Creat(a+1,b,i); T->rchild = Creat(a+i+1,b+i+1,n-i-1); return T; } } return NULL; } //中序遍历非递归...单栈法 后序非递归遍历和先序中序非递归开始类似,先将左子树的左孩子的的左孩子的….每个节点压入栈。

    87110

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

    分析: 借助栈实现非递归中序遍历算法的方法如下: 1)将二叉树的根结点作为当前结点。 2)若当前结点非空,则该结点进栈并将其左孩子结点作为当前结点,重复步骤2),直到当前结点为NULL为止。...3)若栈非空,则将栈顶结点出栈并作为当前结点,接着访问当前结点,再将当前结点的右孩于结点作为当前结点。 4)重复步骤2)、3),直到栈为空且当前结点为NULL为止。...= NULL) { s.push(p); // 未到叶结点,持续往左孩子方向深处遍历 p=p->left; // 将左结点作为当前结点 } if(p == NULL...new TreeNode(3); res=sol.inorderTraversal(root); for(int i:res) cout遍历的方法...,C++11标准支持 return 0; } */

    51830

    树的非递归遍历

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

    9610

    树的非递归遍历

    树使用递归遍历非常方便,如果将代码拉伸开来,我们能否是否非递归代码来实现呢?当然是可以的,我们只要把递归的循环步骤修改为while就可以了。...并放弃其左子树; 如果结点没有左子树,访问该结点; 步骤2: 如果结点有右子树,重复步骤1; 如果结点没有右子树(结点访问完毕),根据栈顶指示回退,访问栈顶元素,并访问右子树,重复步骤1 如果栈为空,表示遍历结束...TirTNode* findLeft(TirTNode* tree, std::stack& st) { if (nullptr == tree) return nullptr; // 持续遍历...= pLeft) { // 打印没有左子树的节点 printf(“%c “, pLeft->data); // 判断节点是否有右子树 if (nullptr !...= pLeft->rightChild) { // 如果有,则遍历这个树下最深的左子树 pLeft = findLeft(pLeft->rightChild, st); } else //如果节点没有右子树

    19520
    领券