树使用递归遍历非常方便,如果将代码拉伸开来,我们能否是否非递归代码来实现呢?当然是可以的,我们只要把递归的循环步骤修改为while就可以了。...但我们需要借用到STL的栈模型来实现这个需求,具体的步骤如下: 步骤1: 如果结点有左子树,该结点入栈,并放弃其左子树; 如果结点没有左子树,访问该结点; 步骤2: 如果结点有右子树,重复步骤1; 如果结点没有右子树...= nullptr) { // 该结点入栈 st.push(tree); // 并继续向下找左子树 tree = tree->leftChild; } // 返回传递进来的 tree 最深的左子树 return...myTreeOrder(TirTNode* tree) { std::stack st; TirTNode* pLeft = findLeft(tree, st); // 返回回来的是没有左子树的节点...= pLeft) { // 打印没有左子树的节点 printf(“%c “, pLeft->data); // 判断节点是否有右子树 if (nullptr !
先序非递归遍历二叉树,中序非递归遍历二叉树,后序非递归遍历二叉树及双栈法。...先序非递归遍历二叉树 先序非递归遍历比较简单,感觉与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; } 后序非递归遍历二叉树及双栈法...单栈法 后序非递归遍历和先序中序非递归开始类似,先将左子树的左孩子的的左孩子的….每个节点压入栈。
二 叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。...因为树的定义本身就是 递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。...在三种遍历中, 前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 ...= NULL)//必不可少的条件,递归的出口 { printf("%2c",root->key); pre_order(root->lchild...,root->data); } } 2.非递归实现 后序遍历的非递归实现是三种遍历方式中最难的一种。
二叉树的基本操作(C 语言版) 1 二叉树的定义 二叉树是每个结点最多有两个子树的树结构,常被用于实现二叉查找树和二叉堆。二叉树是链式存储结构,用的是二叉链,本质上是链表。.../指向右孩子节点 }; 当然,我们也可以为我们的的树节点结构体重新定义一下名字,使用 C 语言中的 typedef 方法就可以了。.../指向右孩子节点 } BiNode, *BiTree; 2 二叉树的建立 二叉树的操作通常使用递归方法,二叉树的操作可以分为两类,一类是需要改变二叉树的结构的,比如二叉树的创建、节点删除等等,这类操作...首先把 5 入队,然后再输出队首元素,并且把队首元素的左结点和右结点入队(如果有的话),以此类推,输出的序列就是层次遍历啦 采用非递归方式实现:引入队列 //层次遍历:非递归实现 void LevelOrderTraverseNonRec...(root);//中序遍历输出 printf("\n层次非递归遍历:"); LevelOrderTraverseNonRec(root);//层次遍历输出 printf("\n二叉树的深度为:
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <algorithm> ...
前言: 上一期分析了快速排序的三种写法,这三种写法有一个相同点,都是采用递归形式来实现的,那么有没有非递归的方法实现呢?...答案是当然有,用非递归的方法实现快速排序,其实可以借助数据结构中的栈来模拟实现递归的过程。...思路图分析: 因为使用c语言写的,所以需要我们自己写一个栈,栈的实现我这里不再过多赘述,我会把栈的码放在最后。假如我们现在有下面这组数组,我们要对它进行排序。...(注意下面的数字代表下标) 好,接下来开始用栈模拟递归:(图中栈中的数字均表示下标) 1.第一次入栈: 将整个数组入栈,也就是下标为0-8 2.第一次出栈: 每次出栈,对出栈的下标区间进行一次部分排序,...现在就不难感受出,这其实是在模拟递归的过程。
文章目录 前言 问题描述 递归实现 非递归实现 参考文献 前言 二叉树翻转是一道经典的面试编程题,经常出现在各大公司的招聘笔试面试环节。...因此翻转一个二叉树,就是把根结点的左子树翻转一下,同样的把右子树翻转一下,在交换左右子树就可以了。 当然,翻转左子树和右子树的过程和当前翻转二叉树的过程没有区别,就是递归的调用当前的函数就可以了。...因此,翻转二叉树的步骤可总结如下: (1)交换根结点的左子结点与右子结点; (2)翻转根结点的左子树(递归调用当前函数); (3)翻转根结点的右子树(递归调用当前函数)。...具体实现 // @brief: 非递归翻转二叉树 // @param: 二叉树根结点 // @ret: 翻转后的二叉树根结点 BinaryTreeNode* invertBTNonrecu(BinaryTreeNode...BinaryTreeNode* root = constructPreMid(preorder, midorder, 7); preorderRecursion(root); cout << endl; // 非递归翻转二叉树
前序遍历的非递归算法 #include using namespace std; #include struct node { char data; node* lchild...; node* rchild; }; //树的建立---前序建立 void creatTree(char ch[10],node*& root) { static int i = 0; if (ch...; root->data = ch[i]; i++; creatTree(ch, root->lchild); creatTree(ch, root->rchild); } } //非递归遍历...#"; creatTree(ch,root); display(root); } int main() { test(); system("pause"); return 0; } 中序遍历的非递归算法...#"; creatTree(ch,root); display(root); } int main() { test(); system("pause"); return 0; } 后序遍历的非递归算法
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说C语言函数递归_c语言递归举例,希望能够帮助大家进步!!! 文章目录 函数递归 什么是递归?...第一次接触递归都会很懵,慢慢理解这个过程就明白了。 什么是递归? 递归做为一种算法在程序设计语言中广泛应用。...在调试 factorial 函数的时候,如果你的参数比较大,那就会报错: stack overflow(栈溢出) 这样的信息。 那如何解决上述的问题: 将递归改写成非递归。...,这只是因为它比非递归的形式更为清晰。...当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开销 结束语 本人是学c小白,这些是近期学习整理总结,有什么不对欢迎大家指正,我会继续努力,谢谢~!
大家好,又见面了,我是你们的朋友全栈君。 今天继续二叉树的学习。 昨天写了一遍二叉树的先序遍历(非递归)算法,今天写一下二叉树的二叉树的中序遍历(非递归)算法。...中序遍历的非递归算法有两种,但是个人觉得只要掌握一种就可以了,只要自己的逻辑清晰,会哪一种又有什么关系呢~ 首先给出今天的二叉树的示例图: 代码如下: #include "stdafx.h" #include...StackEmpty(S)) { if(p) { Push(S,*p); p = p->lchild; } else { Pop(S,e); printf("%c ",e.data); p...但是,为了多练习,还是应该再敲一遍,说不定会有新的启发。对于C语言,自己可能还是刚入门阶段,但是不去多练习,又怎么会有提高呢!...关于二叉树的一些原理什么的,在更新完相应的内容之后会做一个汇总,形成知识框架,不止为了记录在博客上,也是为了更好的印在脑海里! 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。
因为树的定义本身就是 递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。...在三种遍历中, 前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 ...= NULL)//必不可少的条件,递归的出口 { printf("%2c",root->key); //访问根结点 pre_order(root...,root->data); } } 2.非递归实现 后序遍历的非递归实现是三种遍历方式中最难的一种。...此算法也是一个递归过程,若树为空则返回0结束递归,若树根结点的值等于x的值则返回左、右两棵子树中等于x结点的个数加1,否则只应返回左、右两棵子树中等于x结点的个数。
一.什么是二叉搜索树 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 根据二叉搜索树的性质,它的中序遍历结果就是一个升序列。...根据二叉搜素树的性质: 当key小于节点的 _key 时,更新parent,就到树的左边; 当key大于节点的 _key 时,更新parent,就到树的右边; 当cur...为空时,跳出循环,进行节点间的链接操作(同样遵循二叉搜索树的性质) bool Insert(const K& key) { if (_root == nullptr) //注意树为空的情况 {... insertR 既然要递归,那么肯定要用到根节点,同样使用中序遍历那样的方式,函数里再套一个函数。...其实理论还是和非递归的一样,只不过换成了调用函数,但这里有个小窍门,就是我们可以传根节点的引用,这样就不用定义一个父节点指针了,根据引用的特性,引用是一个变量的别名,当我们递归到下一层时,此时传过来的root
//非递归的前序遍历 void preOrderByStack(); //非递归的中序遍历 void inOrderByStack(); //非递归的后序遍历 void postOrderByStack...查找函数的实现: 下面提供递归和非递归 2 种方案,如果存在要查找的结点,返回此结点,如果没有查找,则返回最后访问过的结点。...除了可以使用递归方案实现树的遍历,也可以使用非递归方案实现遍历,下面再讨论如何使用非递归实现遍历。...bt->preOrder(root); cout<<endl; //非递归前序遍历二叉树 bt->preOrder(); return 0; } 输出结果: 非递归中序遍历...bt->inOrder(root); cout<<endl; //非递归中序遍历二叉树 bt->inOrder(); return 0; } 输出结果: 非递归后序遍历。
二叉树也是常用的数据结构,通过使用二叉树可以快速的对数据进行排序或者查找,在常用的堆排序算法中,堆的底层实质就是一个模拟的完全二叉树!等等,什么是完全二叉树?二叉树又是什么?有哪几类?...,对其进行中序遍历后,会得到一个有序的列表,这是我们经常用到的一种数的结构 平衡二叉树:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,并且满足二叉搜索树的规则...递归版本(先、中、后序) 递归版的遍历算法很简单了,我们只需要改变打印次序就好了,也没有什么可讲的!...printPostorder1(head->left); printPostorder1(head->right); cout value << " ";} 非递归版本...(先、中、后序) 首先我们要清楚,任何算法的递归版本都可以改成非递归版本,因为函数递归调用其实质就是压栈的过程,那么我们完全可以使用堆栈来模拟这个过程!
递归实现 先序 public void preOrder(){ preOrder(root); } private void preOrder(Node node){ if(node !...非递归 前序 public void preOrderNew(){ preOrderNew(root); } private void preOrderNew(Node node){ if
一.二叉树的非递归前序遍历 public static void preOrderUnRecur(TreeNode root){ if (root == null) return; Stack...= null){ stack.add(temp.left); } } } 二.二叉树的非递归中序遍历 image.png public static...System.out.print(temp.val+" "); root = temp.right; } } } 三.二叉树的非递归后序遍历...采用2个栈,这个与前序遍历类似,只不过是在该打印的时候,用一个栈将其存放起来,最后打印。
二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的...对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。...在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 ... 后序遍历的非递归实现是三种遍历方式中最难的一种。...s为形如A(B,C(D,E))形式的字符串 { int i; bool isRight=false; stack s1; //存放结点 stack
昨天同学去參加阿里巴巴面试,被问到二叉树的一些基本问题,分享一下: 1.怎样非递归dfs求得树的深度 2.怎样非递归bfs求得树的深度 *3.怎样非递归地中前后序遍历二叉查找树。...//非递归,深度搜索树的深度 { return get_depth_dfs ( root ); } int get_depth_bfs() //非递归。...t.travel_dg_suf(); cout << "\n非递归递归后序遍历:\n"; t.travel_suf(); cout << "\n递归求的树的高度\n";...cout << t.get_depth_dg(); cout << "\n非递归dfs求的树的高度\n"; cout << t.get_depth_dfs(); cout <<..."\n非递归bfs求的树的高度\n"; cout << t.get_depth_bfs(); } 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/115773
代码演示 stack.h里面的代码: #pragma once #include #include #define MAX 1024 //这里的栈已经知道数组的最大长度...void* data[MAX]; int size; }; //隐藏数据,不让用户能够得到操作结构体的接口 //类似c++类中的private属性 typedef void* seqStack;...main.cpp #define _CRT_SECURE_NO_WARNINGS #include #include #include"stack.h" //二叉树的非递归遍历...top_stack(mystack); //出栈 pop_stack(mystack); //如果标志为真,直接输出 if (pTop->flag == 1) { printf("%c...BinaryNode Anode = { 'A',NULL,NULL,0 }; BinaryNode Bnode = { 'B',NULL,NULL,0 }; BinaryNode Cnode = { 'C'
一、递归实现前序,序,后序遍历; 对于二叉树,前面已经采用递归的方式实现的其前序,中序,后序遍历,具体请参见: http://blog.csdn.net/dai_wen/article/details/...78955411 那么,如何采用非递归的方式遍历树呢?...下面,以实现中序遍历二叉树为主题展开: 二、非递归实现 中序遍历: 1,结构: 首先,对于中序遍历,我们知道,原则是先走到的结点后访问,后走到的结点先访问,这显然是栈的结构; 2,访问结点的具体步骤:...: 那么,根据文字,画出如下流程图: //下面,举个例子: 如下所示的五个结点的二叉树,其非递归中序遍历如下图所示: (1)实现思路图如下所示: (2)具体程序实现: #include <...s.empty()) //如果没有右孩子,说明该节点的树放完毕,需要返回。
领取专属 10元无门槛券
手把手带您无忧上云