昨天写了一遍二叉树的先序遍历(非递归)算法,今天写一下二叉树的二叉树的中序遍历(非递归)算法。...中序遍历的非递归算法有两种,但是个人觉得只要掌握一种就可以了,只要自己的逻辑清晰,会哪一种又有什么关系呢~ 首先给出今天的二叉树的示例图: 代码如下: #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语言,自己可能还是刚入门阶段,但是不去多练习,又怎么会有提高呢!就像做数学题一样,自己觉得看着都会,却又不去动手去做,那在真正考试的时候,很可能的结果就是大部分题目都做不出来。
,中序遍历,后序遍历,层序遍历四种方式,下面一一介绍。 ...尾递归的递归调用需要用栈存储调用的信息,当数据规模较大时容易越出栈空间。虽然现在大部分的编译器能够自动去除尾递归,但是即使如此,我们不妨自己去除。非递归先序遍历算法基本思路:使用堆栈 a....中序遍历 中序遍历的遍历路径与先序遍历完全一样。其实现的思路也与先序遍历非常相似。...printf("%d\n", T->Data); //(访问) 打印结点 T = T->Right; //转向右子树 } } } 非递归不用辅助栈实现中序遍历...: 试设计一个非递归算法,按中根顺序遍历非线索二叉树,但不得用任何辅助栈。
但是排序遍历也是比较重要的一环。所以笔者将前中后序.和层序遍历梳理一遍。 了解树的遍历,需要具有的只是储备有队列,递归,和栈。这里笔者都有进行过详细介绍,可以关注笔者数据结构与算法专栏。...三序遍历只是利用了递归中的来回过程中不同片段截取输出,而达到前(中、后序遍历的结果)。 前序递归 前序的规则就是根结点 ---> 左子树 ---> 右子树.我们在调用递归前进行节点操作。...有了前序的经验,我们就很好利用递归实现中序遍历。...非递归中序和前序有所区别。...= null) { t2 = t2.left; q1.push(t2); } } } } 非递归后序※ 非递归后序遍历有两种方法 一种方法是利用和前面中序
先序遍历:8 6 5 7 10 9 11 后序遍历:5 7 6 9 11 10 8 中序遍历:5 6 7 8 9 10 11 按层遍历:8 6 10 5 7 9 11 之字遍历:8 10 6 5 7 9...11 先序遍历 递归 public static void printBTPerRecursion(TreeNode root){ if (root!...node = stack.pop(); node = node.right; } } } 中序遍历...() //非递归后序遍历 参考自https://blog.csdn.net/zhuqiuhui/article/details/51319165 public static void printBTBackUnrecursion...= null)queue.add(node1.right); } } 之字遍历 非递归(需要两个栈,两个栈交替装入每一层的结点,一个栈先装左节点再装右节点,另一个栈先装右节点再装左节点
算法思想:每次把最左边的加到栈里,一直到没有左结点,从栈中取数据并打印,把右孩子当作头再遍历该子树 package com.algorithm.practice.tree.traversal;
前序遍历,中序遍历,后序遍历的区别就是根在前(根左右),根在中(左根右),根在后(左右根) 在最后补全所有源码 二 广度优先遍历 层次遍历 //广度优先遍历 层次遍历 public...//中序遍历 public void inOrder(TreeNode subTree) { if (subTree !...subTree.leftChild); visted(subTree); inOrder(subTree.rightChild); } } //中序遍历的非递归实现...node = stack.pop(); node = node.rightChild; } } } //中序遍历的非递归实现...bt.nonRecPreOrder(bt.root); System.out.println("***非递归实现****(中序遍历)遍历*****************");
举一个反例即可证明根据扩充二叉树的中序遍历序列是不能唯一确定二叉树的结构,以文档中的描述为例: image.png 上图中扩展二叉树的中序遍历序列为:#B#D#A#C#,那么也可以对应为下面的扩展二叉树...: image.png 2.1前序+中序序列构建二叉树(递归实现) 构建过程: (1)前序遍历序列中的第一个数字为根节点,构造根节点; (2)找到根节点在中序遍历序列中的位置,中序中根节点左右两边分别为左子树和有子树...在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。下面一一讲解具体的递归和非递归实现。...后序遍历的非递归实现是三种遍历方式中最难的一种。...中序构建二叉树可以用非递归的方法来实现,等等,鄙人后续会继续完善的。
1.问题描述 非递归中序遍历二叉树。 示例 1: 中序序列:2 1。 示例 2: 中序序列:1 2。 示例 3: 中序序列:2 1 3。 2.难度等级 medium。...4.解题思路 中序遍历按照“左子树 > 根结点——右子树”的顺序进行访问。而在访问左子树或右子树的时候我们按照同样的方式遍历,直到遍历完整棵树。...return nodes } 递归很简单,如何使用非递归的方式中序遍历呢? 只要是递归,便可以使用栈模拟递归的过程。 首先遍历根节点,如果非空则入栈。...struct { * Val int * Left *TreeNode * Right *TreeNode * } */ // inorderTraversal 非递归中序遍历二叉树...二叉树的中序遍历 - leetcode
树的递归遍历算法很容易理解,代码也很精简,但是如果想要从本质上理解二叉树常用的三种遍历方法,还得要思考树的非递归遍历算法。...读完后的收获: 您将学到二叉树的中序遍历的非递归版本 明白栈这种数据结构该怎么使用 02 — 讨论的问题是什么? 主要讨论二叉树的非递归版中序遍历该如何实现,包括借助什么样的数据结构,迭代的思路等。...中序遍历 Inorder Traversal 访问根结点的操作发生在遍历其左、右子树之中间。 04 — 非递归版中序遍历算法 这里我们以二叉树为例,讨论二叉树的中序遍历的非递归版实现。...05 — 评价算法 非递归版中序遍历算法的时间复杂度为 O(n),空间复杂度为栈所占的内存空间为 O(n)。...06 — 总结 讨论了二叉树的非递归版中序遍历算法,算法借助栈,巧妙地对每个叶子节点虚拟出一个子右节点,按照左子树,根节点,右子树的遍历次序访问整棵树,时间和空间复杂度都为 O(n)。
阿里二面的算法题 非递归写法 前序遍历 void pretOrder(TreeNode *root){ if(root==nullptr) return root; TreeNode...p=p->left; } p=st.top(); st.pop(); p=p->right; } } 中序遍历...} p=st.top(); coutval; st.pop(); p=p->right; } } 后序遍历
昨天发了前序、中序、后序遍历二叉树通用公式这篇文章 转发到一个号称人均leetcode100道题的群之后 受到了如下鄙视 ?...但是技不如人,我也没办法刷到平均数 那就发一版非递归版的,接着搬砖努力吧 ?...对于遍历二叉树这种数据结构,最直觉的思路就是使用递归或者栈进行辅助 节点出栈的顺序即为遍历的顺序 以下三种算法均基于栈这种数据结构实现 1....中序遍历 2.1 思路 中序遍历的规则是“左中右” 即先遍历左边的,再中间(当前节点),最后右边的 所以最先拿的数据应该是最左边的节点 a、先将根节点压入栈 b、判断栈顶元素是否存在左节点,如果存在,则压入栈...至此,中序遍历完成 2.3 代码实现 public List inorderTraversal(TreeNode root) { List result =
算法思想:利用栈的先进后出思想实现 先把头结点压栈,定义一个指向栈顶的指针,从栈中取元素并打印,从右向左先判断当前结点有没有右结点,有的话则压栈.再判断结点有么有左节点,有的话就压栈 public
数据结构二叉树遍历基础,递归解法在很早之前的博客就以C语言的形式总结了,这篇博文聚焦非递归解法。...二叉树的前序、中序、后序遍历都可以借助栈来实现,因为递归本质也是靠栈来实现的,中序遍历还有一种比较难想的镜像法。 前序遍历 leetcode 144....= null) { stack.push(cur.left); } } return res; } } 中序遍历...Binary Tree Inorder Traversal 维护一个cur指针和栈,cur指针指向当前处理的节点,栈中存将要处理的节点,二者任意为空结束循环。...Binary Tree Postorder Traversal 直接使用栈,入栈顺序先左子树后右子树(跟前序遍历相反,想一想为什么),逆序加入结果集(想一想为什么)。
(左右根) 先序遍历 递归先序遍历 递归先序遍历很容易理解,先输出节点的值,再递归遍历左右子树。中序和后序的递归类似,改变根节点输出位置即可。...图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
先序非递归遍历二叉树,中序非递归遍历二叉树,后序非递归遍历二叉树及双栈法。...先序非递归遍历二叉树 先序非递归遍历比较简单,感觉与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; } //中序遍历非递归...单栈法 后序非递归遍历和先序中序非递归开始类似,先将左子树的左孩子的的左孩子的….每个节点压入栈。
文章目录 1.问题描述 2.难度等级 3.热门指数 4.解题思路 5.实现示例 5.1 C++ 5.2 Golang 参考文献 1.问题描述 非递归中序遍历二叉树。 示例 1: 中序序列:2 1。...return nodes } 递归很简单,如何使用非递归的方式中序遍历呢? 只要是递归,便可以使用栈模拟递归的过程。...TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ // inorderTraversal 非递归中序遍历二叉树...struct { * Val int * Left *TreeNode * Right *TreeNode * } */ // inorderTraversal 非递归中序遍历二叉树...二叉树的中序遍历 - leetcode
分析: 借助栈实现非递归中序遍历算法的方法如下: 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<<i<<" "; // 此处为vector遍历的方法...,C++11标准支持 return 0; } */
树使用递归遍历非常方便,如果将代码拉伸开来,我们能否是否非递归代码来实现呢?当然是可以的,我们只要把递归的循环步骤修改为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 //如果节点没有右子树
遍历命名 ------------百度百科 根据访问结点操作发生位置命名: ① NLR:前序遍历(Preorder Traversal 亦称(先序遍历)) ——访问根结点的操作发生在遍历其左右子树之前...② LNR:中序遍历(Inorder Traversal) ——访问根结点的操作发生在遍历其左右子树之中(间)。...③ LRN:后序遍历(Postorder Traversal) ——访问根结点的操作发生在遍历其左右子树之后。...这里以中序遍历讲一下该递归: 代码 package com.algorithm.practice.tree.traversal; public class PreInPosTraversal {
7 无左子树,因此访问节点 7,又因为该节点无右子树,因此节点 1 的右子树遍历完成,即整棵树遍历完成; 因此,上图中二叉树采用中序遍历得到的序列为:4 2 5 1 6 3 7 中序遍历代码(递归...INOrderTraverse(Tree); } 中序遍历代码(非递归) 和非递归先序遍历类似,唯一区别是考查到当前节点时,并不直接输出该节点。...: 栈顶元素的地址 * @Author: Carlos */ BiTree GetTop(BiTree*a){ return a[top]; } /** * @Description: 中序遍历非递归算法...//将p指向的结点的右孩子进栈 Push(a, p->rchild); } } } /** * @Description: 中序遍历非递归算法...: \n"); PreOrderTraverse(Tree); } 后序遍历代码(非递归) /* * @Description: 二叉树的后序遍历(非递归) * @Version: V1.0
领取专属 10元无门槛券
手把手带您无忧上云