二叉树的基本操作(C 语言版) 1 二叉树的定义 二叉树是每个结点最多有两个子树的树结构,常被用于实现二叉查找树和二叉堆。二叉树是链式存储结构,用的是二叉链,本质上是链表。.../指向右孩子节点 }; 当然,我们也可以为我们的的树节点结构体重新定义一下名字,使用 C 语言中的 typedef 方法就可以了。...root->data); PreOrderTraverse(root->lchild); PreOrderTraverse(root->rchild); } } 方案二:非递归 非递归实现:...(root->lchild); printf("%d ", root->data); InOrderTraverse(root->rchild); } } 方案二:非递归 非递归实现:引入辅助栈...(root->lchild); PostOrderTraverse(root->rchild); printf("%d ", root->data); } } 方案二:非递归 非递归实现:引入辅助栈
今天继续二叉树的学习。 昨天写了一遍二叉树的先序遍历(非递归)算法,今天写一下二叉树的二叉树的中序遍历(非递归)算法。...中序遍历的非递归算法有两种,但是个人觉得只要掌握一种就可以了,只要自己的逻辑清晰,会哪一种又有什么关系呢~ 首先给出今天的二叉树的示例图: 代码如下: #include "stdafx.h" #include...void CreateBiTree(BiTree &T) { char ch; scanf("%c",&ch); if(ch == '#') T = NULL; else { T = (BiTNode...StackEmpty(S)) { if(p) { Push(S,*p); p = p->lchild; } else { Pop(S,e); printf("%c ",e.data); p...对于C语言,自己可能还是刚入门阶段,但是不去多练习,又怎么会有提高呢!就像做数学题一样,自己觉得看着都会,却又不去动手去做,那在真正考试的时候,很可能的结果就是大部分题目都做不出来。
先序非递归遍历二叉树,中序非递归遍历二叉树,后序非递归遍历二叉树及双栈法。...先序非递归遍历二叉树 先序非递归遍历比较简单,感觉与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; } 后序非递归遍历二叉树及双栈法...单栈法 后序非递归遍历和先序中序非递归开始类似,先将左子树的左孩子的的左孩子的….每个节点压入栈。
前言: 上一期分析了快速排序的三种写法,这三种写法有一个相同点,都是采用递归形式来实现的,那么有没有非递归的方法实现呢?...答案是当然有,用非递归的方法实现快速排序,其实可以借助数据结构中的栈来模拟实现递归的过程。...思路图分析: 因为使用c语言写的,所以需要我们自己写一个栈,栈的实现我这里不再过多赘述,我会把栈的码放在最后。假如我们现在有下面这组数组,我们要对它进行排序。...(注意下面的数字代表下标) 好,接下来开始用栈模拟递归:(图中栈中的数字均表示下标) 1.第一次入栈: 将整个数组入栈,也就是下标为0-8 2.第一次出栈: 每次出栈,对出栈的下标区间进行一次部分排序,...现在就不难感受出,这其实是在模拟递归的过程。
树使用递归遍历非常方便,如果将代码拉伸开来,我们能否是否非递归代码来实现呢?当然是可以的,我们只要把递归的循环步骤修改为while就可以了。...= pLeft) { // 打印没有左子树的节点 printf(“%c “, pLeft->data); // 判断节点是否有右子树 if (nullptr !
二 叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。...因为树的定义本身就是 递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。...在三种遍历中, 前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 ...= NULL)//必不可少的条件,递归的出口 { printf("%2c",root->key); pre_order(root->lchild...,root->data); } } 2.非递归实现 后序遍历的非递归实现是三种遍历方式中最难的一种。
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <algorithm> ...
我们在建设一个网站的时候,程序员们首选的当属PHP语言。我们对PHP还是比较熟悉的,接下来我们将会为大家介绍一下PHP递归算法。...PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,现在被很多的网站编程人员广泛的运用。...我们这里详细的介绍一下PHP递归算法。 PHP递归算法代码: < ?...希望下面的代码,会更有利于对PHP递归算法以及静态变量的理解 header(“Content-type:text/plain”); functionstatic_function() { static...\n”; static_function(); } } static_function(); 这段PHP递归算法代码会如数输出1到10的数字。
文章目录 前言 问题描述 递归实现 非递归实现 参考文献 前言 二叉树翻转是一道经典的面试编程题,经常出现在各大公司的招聘笔试面试环节。...可见,在求职面试过程中,即使你是一位优秀的程序员,如果答不上算法题,那么在算法方面的能力将被面试官认为是不及格的,甚至无法被聘用。 问题描述 给定一个二叉树,输出其镜像。...preorderRecursion(invertRoot); // 4,7,9,6,2,3,1 } 运行输出: 4 2 1 3 7 6 9 --- after invert --- 4 7 9 6 2 3 1 非递归实现...具体实现 // @brief: 非递归翻转二叉树 // @param: 二叉树根结点 // @ret: 翻转后的二叉树根结点 BinaryTreeNode* invertBTNonrecu(BinaryTreeNode...BinaryTreeNode* root = constructPreMid(preorder, midorder, 7); preorderRecursion(root); cout << endl; // 非递归翻转二叉树
今天说一说C语言函数递归_c语言递归举例,希望能够帮助大家进步!!! 文章目录 函数递归 什么是递归?...第一次接触递归都会很懵,慢慢理解这个过程就明白了。 什么是递归? 递归做为一种算法在程序设计语言中广泛应用。...那如何解决上述的问题: 将递归改写成非递归。 使用static对象替代 nonstatic 局部对象。...,这只是因为它比非递归的形式更为清晰。...当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开销 结束语 本人是学c小白,这些是近期学习整理总结,有什么不对欢迎大家指正,我会继续努力,谢谢~!
本博客前面文章已对树与二叉树有过简单的介绍,本文主要是重点介绍有关二叉树的一些具体操作与应用 阅读本文前,可以先参考本博客 各种基本算法实现小结(三)—— 树与二叉树 和 各种基本算法实现小结...(二)—— 堆 栈 二叉树 深度层数、叶子数、节点数和广度优先算法 以及树的先序、中序、后序的递归与非递归(深度优先) 测试环境:VS2008(C) #include "stdafx.h...tree's leaf */ int n_tree=0; /* tree's node */ /**************************************/ /******** 树的结构定义...=NULL) { printf("%3c", p->data); push_stack(ps, p); p=p->lchild; } if(!...empty_queue(qu)) { p=de_queue(qu); printf("%3c", p->data); if(p->lchild!
前序遍历的非递归算法 #include using namespace std; #include struct node { char data; node* lchild...; 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; } 中序遍历的非递归算法...; 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; } 后序遍历的非递归算法
在上一篇文章里说了递归,这里就使用其中的上楼梯问题来进行代码实现,在上一篇文章里也说过了中间会有重复计算的情况,这里我们使用一维动态数组来进行存储,一维数组的索引值就与楼梯层数相同,可以更加清晰的理解其中的含义...代码:GitHub[1] 引用链接 [1] GitHub: https://github.com/veselwuxin/code.seclibs.com/blob/master/c/Recursion.c
数列后面的数字依据上述相同法则,分别插入到树的不同位置。如下图所示。 原始数列中的数字是无序的,根据二叉排序树的插入算法,最终可得到一棵有排序性质的树结构。...对此棵树进行中序遍历就可得到从小到大的一个递增有序数列。 综观二叉排序树,进行关键字查找时,也应该是接近于二分查找算法的时间复杂度。...除了可以使用递归方案实现树的遍历,也可以使用非递归方案实现遍历,下面再讨论如何使用非递归实现遍历。...bt->preOrder(root); cout<<endl; //非递归前序遍历二叉树 bt->preOrder(); return 0; } 输出结果: 非递归中序遍历...bt->inOrder(root); cout<<endl; //非递归中序遍历二叉树 bt->inOrder(); return 0; } 输出结果: 非递归后序遍历。
树的递归遍历算法很容易理解,代码也很精简,但是如果想要从本质上理解二叉树常用的三种遍历方法,还得要思考树的非递归遍历算法。...那么,如此递归结构,该如何思考写出非递归算法呢? ?...以上就是后序遍历非递归版的思路。 05—实现代码 这里我们以二叉树为例,讨论二叉树的后序遍历的非递归版实现。 我们先看下二叉树的节点TreeNode的数据结构定义。...非递归版后序遍历算法的时间复杂度为 O(n),空间复杂度为栈所占的内存空间为 O(n)。...06—总结 讨论了二叉树的非递归版后序遍历算法,算法借助栈,相比于前序遍历和中序遍历,它多了一个指针指向上一迭代中访问过的节点,目的是为了判断是否向右子树展开,算法的时间和空间复杂度都为 O(n)。
二叉树遍历算法的改进 二叉树的深度优先遍历算法都是用递归函数实现的,这是很低效的,原因在于系统帮你调用了一个栈并做了诸如保护现场和恢复现场等复杂的操作,才使得遍历可以用非常简洁的代码实现。...二叉树深度优先遍历算法的非递归实现用用户定义的栈来代替系统栈,也就是用非递归的方式来实现遍历算法,可以得到不小的效率提升。...二叉树深度优先遍历算法的非递归实现 (1)先序遍历非递归算法 要写出其遍历的非递归算法,其主要任务是用自己定义的栈来代替系统栈的功能。 以图1所示的二叉树为例,过程为图二所示 初态栈空 结点1入栈。...= NULL) //栈顶结点的左孩子存在,则左孩子入栈 Stack[++top] = p->lchild; } } } (2)中序遍历非递归算法 类似于先序遍历...因此,只需要将前面的非递归先序遍历算法中对左右子树的遍历顺序交换就可以得到逆后序遍历序列,然后将逆后序遍历序列逆序就得到了后序遍历序列。
「@Author:Runsen」 刷Leetcode,需要知道一定的算法模板,本次先总结下二叉树的递归和非递归的遍历算法模板。 二叉树的四种遍历方式,前中后加上层序遍历。...递归 下面伪代码是二叉树遍历的递归算法模板,顺序是中左右,也就是前序遍历,改变中左右三行代码的顺序,前中后序三种递归遍历轻松解决。...+代码,递归算法模板一定要加上终止条件,不然一入递归深似海,从此offer是路人,来源代码随想录。...关于树的不同深度优先遍历(前序,中序和后序遍历)就是递归和非递归的写法。广度优先遍历在树中,就是层次遍历。 在二叉树的层级遍历中,我们需要用到队列这个数据结构,帮助我们完成遍历。...其实本质上也是深度优先遍历与广度优先遍历的算法模板,许多其它操作都是建立在树遍历操作的基础之上,因此掌握树的所有遍历方法,等于解决了一半树的题目。
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。...最坏情况是每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录,划分的结果是基准左边的子区间为空(或右边的子区间为空),而划分所得的另一个非空的子区间中记录数目,仅仅比划分前的无序区中记录个数减少一个...总的关键字比较次数:O(nlgn) 尽管快速排序的最坏时间为O(n*n),但就平均性能而言,它是基于关键字比较的内部排序算法中速度最快者,快速排序亦因此而得名。...快排空间复杂度:在通常情况下为O(log2n),需要使用深O(log2n)的栈实现递归,如果是最坏情况的话,很显然就要O(n)的空间了。...********************************** C++实现代码: https://github.com/wylloong/TinyPrograms/blob/master/Coding
先根遍历(递归) 【数据结构】树与二叉树(七):二叉树的遍历(先序、中序、后序及其C语言实现) a.理论 b....通过递归地调用先根遍历算法,依次访问树的根节点、根节点的孩子节点、孩子节点的兄弟节点,以此类推,完成对整个树的先根遍历。 c....先根遍历(非递归) a. ADL算法NPO b. NPO算法解析 栈的初始化: CREATE(S): 创建一个栈 S 用于存储待访问的节点。...代码实现 // 先根遍历的非递归算法 void NorecPreOrder(TreeNode* t) { if (t == NULL) { return; }...C->nextBrother = D; C->firstChild = E; E->nextBrother = F; // 使用递归先根遍历算法 printf
斐波那契数列的表达式: F(1)=1 F(2)=1 F(n)=F(n-1)+F(n-2) (n>2) 递归算法:时间复杂度O(2^n) int recursive_method(int...) return 1; else return recursive_method(n - 1) + recursive_method(n - 2); } 非递归算法
领取专属 10元无门槛券
手把手带您无忧上云