先序遍历

递归 VS 非递归 内涵

空扰寡人 提交于 2020-01-16 05:13:08
递归与非递归转换的基础知识是能够正确理解三种树的遍历方法:前序,中序和后序,第一篇就是关于这三种遍历方法的递归和非递归算法。 一、为什么要学习递归与非递归的转换的实现方法? 1)并不是每一门语言都支持递归的。 2)有助于理解递归的本质。 3)有助于理解栈,树等数据结构。 二、三种遍历树的递归和非递归算法 递 归与非递归的转换基于以下的原理:所有的递归程序都可以用树结构表示出来。需要说明的是,这个”原理”并没有经过严格的数学证明,只是我的一个猜 想,不过在至少在我遇到的例子中是适用的。学习过树结构的人都知道,有三种方法可以遍历树:前序,中序,后序。理解这三种遍历方式的递归和非递归的表达方 式是能够正确实现转换的关键之处,所以我们先来谈谈这个。需要说明的是,这里以特殊的二叉树来说明,不过大多数情况下二叉树已经够用,而且理解了二叉树的 遍历,其它的树遍历方式就不难了。 1)前序遍历 a)递归方式: void preorder_recursive(Bitree T) /* 先序遍历二叉树的递归算法 */ { if (T) { visit(T); /* 访问当前结点 */ preorder_recursive(T->lchild); /* 访问左子树 */ preorder_recursive(T->rchild); /* 访问右子树 */ } } b)非递归方式 void preorder

二叉树的建立与遍历(简单操作)

亡梦爱人 提交于 2020-01-14 11:18:49
Description 已知一个按先序序列输入的字符序列,如abc,de,g,f,(其中逗号表示空节点)。请建立二叉树并按中序和后序方式遍历二叉树,最后求出叶子节点个数和二叉树深度。 <o:p></o:p> Input 输入一个长度小于50个字符的字符串。 Output 输出共有4行: 第1行输出中序遍历序列; 第2行输出后序遍历序列; <o:p></o:p>第3行输出叶子节点个数; <o:p></o:p>第4行输出二叉树深度。<o:p></o:p> Sample Input abc,de,g,f, Output cbegdfa cgefdba 3 5 ————————————————————————————————————— 先序遍历,中序遍历,后序遍历 思想一样,只是顺序不同 二叉树高度计算 递归解法: (1)如果二叉树为空,二叉树的深度为0 (2)如果二叉树不为空,二叉树的深度 = max(左子树深度, 右子树深度) + 1 ———————————————————————————————————— # include <bits/stdc++.h> using namespace std ; struct node { char data ; struct node * lt ; //指向根的左子树 struct node * rt ; //指向根的右子树 } ; char

二叉树的后序遍历

假如想象 提交于 2020-01-14 00:55:07
如下图表示一颗二叉树,对它进行先序遍历操作,采用两种方法,递归和非递归操作。。 遍历结果为:4526731。。 1、递归操作: 思想:若二叉树为空,返回。否则 1)后序遍历右子树;2)后序遍历左子树;3)遍历根节点 代码: void PostOrder(BiTree root) { if(root==NULL) return ; PostOrder(root->lchild); //递归调用,后序遍历左子树 PostOrder(root->rchild); //递归调用,后序遍历右子树 printf("%c ", root->data); //输出数据 } 2、非递归操作 代码: void PostOrder_Nonrecursive(BiTree T) // 后序遍历的非递归 { stack<BiTree> S; BiTree curr = T ; // 指向当前要检查的节点 BiTree previsited = NULL; // 指向前一个被访问的节点 while(curr != NULL || !S.empty()) // 栈空时结束 { while(curr != NULL) // 一直向左走直到为空 { S.push(curr); curr = curr->lchild; } curr = S.top(); // 当前节点的右孩子如果为空或者已经被访问,则访问当前节点

数据结构基础温故-4.树与二叉树(上)

孤者浪人 提交于 2020-01-09 00:33:45
前面所讨论的线性表元素之间都是一对一的关系,今天我们所看到的结构各元素之间却是一对多的关系。树在计算机中有着广泛的应用,甚至在计算机的日常使用中,也可以看到树形结构的身影,如下图所示的Windows资源管理器和应用程序的菜单都属于树形结构。树形结构是一种典型的 非线性 结构,除了用于表示相邻关系外,还可以表示层次关系。本文重点讨论树与二叉树的基本结构和遍历算法等内容。 一、好大一棵树,绿色的祝福 1.1 树的基本概念 Defination: 树(Tree)是 n(n≥0)个结点的有限集。n=0时,该树被称为“空树”。如上图所示,A点称为根节点,它有两棵子树,分别以B、C为根,而以C为根的子树又可以分成两棵子树。   1.2 树的基本术语   (1)不同的节点:根节点、内部节点、叶子节点以及节点的 度    (2)节点的关系:双亲与孩子,爸爸回来了,爸爸去哪儿?   (3)节点的层次:结点的层次(Level)从根开始定义起,根为第一层,根的孩子为第二层。树中结点的最大层次称为树的 深度 (Depth)或 高度 。 二、二叉树又是个什么鬼 2.1 从猜数字游戏引出二叉树   回忆一下,当年某电视节目中会让游戏参与者猜一个产品的价格,如果参与者在限定时间内猜对了,那么他就可以获得这个产品。很多人都是一点点的提高数值来猜,但是这样猜会很没有效率。因此

数据结构——二叉树的遍历

不羁岁月 提交于 2020-01-06 16:07:13
二叉树的先序遍历、中序遍历和后序遍历的递归算法,二叉树的非递归算法。 1、括号表示法创建二叉树 2、实现二叉树的递归遍历算法和非递归遍历算法(非递归算法选做),依次输出二叉树的先序、中序和后序遍历序列 3、二叉树的遍历遍历二叉树,输出结点值大于C的结点,而小于等于C的结点用*替代 4、遍历二叉树,输出结点值小于D的结点,而大于等于D的结点用*替代 main.cpp # include <malloc.h> # include <stdio.h> # include <iostream> using namespace std ; typedef char ElemType ; //Visit函数,对每个节点进行的访问 //需设置函数返回值类型 typedef void Status ; Status DispLargeThanC ( ElemType e ) //该函数输出树中大于C的字符 { if ( e > 'C' ) { printf ( "%2c" , e ) ; } else { printf ( "%2c" , '*' ) ; } } Status DispLessThanD ( ElemType e ) //该函数输出树中小于D的字符 { if ( e < 'D' ) { printf ( "%2c" , e ) ; } else { printf ( "%2c" ,

【洛谷1030】求先序遍历

白昼怎懂夜的黑 提交于 2020-01-03 10:40:15
原题: 给出一棵二叉树的中序与后序排列。求出它的先序排列。 性质: 1.三序遍历的序列中,同一子树的所有节点不留空隙地组成一个区间,即对于任意子树,存在一个区间使得区间内每个点都恰好是子树中的一个节点 2.中序遍历序列中,在一个子树的区间中,子树根节点左边的区间是左子树区间,右边的区间是右子树区间 3.后序遍历序列中,一个子树区间内,子树根节点左边是右子树区间,再左边是左子树区间 4.由上可以推出在某个字数区间中,后序遍历标号最大的节点是根节点 那么可以递归,参数为中序遍历序列中子树的区间端点,每次在子树区间中找到后序遍历标号最大的点,即子树根节点,然后递归处理左右子树区间 代码:(题目中不同节点用不同大写字母表示) 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int s[110000],t[110000],n,m; 5 int iod[110000],pstod[110000]; 6 void gtprod(int l,int r){ 7 if(l>r) return ; 8 int mx=0; 9 for(int i=l;i<=r;++i)if(pstod[s[i]]>pstod[s[mx]]) 10 mx=i; 11 printf("%c",s[mx]-1+'A'); 12 gtprod(l

二叉树遍历python

大憨熊 提交于 2019-12-25 13:45:32
二叉树遍历有先序遍历中序遍历和后序遍历 以下遍历以该二叉树为例: 3.1 前序遍历   思想:先访问根节点,再先序遍历左子树,然后再先序遍历右子树。总的来说是根—左—右   上图先序遍历结果为为:   代码如下: def PreOrder ( self , root ) : '''打印二叉树(先序)''' if root == None : return print ( root . val , end = ' ' ) self . PreOrder ( root . left ) self . PreOrder ( root . right ) 3.2 中序遍历   思想:先中序访问左子树,然后访问根,最后中序访问右子树。总的来说是左—根—右   上图中序遍历结果为为:   代码如下: def InOrder ( self , root ) : '''中序打印''' if root == None : return self . InOrder ( root . left ) print ( root . val , end = ' ' ) self . InOrder ( root . right ) 3.3 后序遍历   思想:先后序访问左子树,然后后序访问右子树,最后访问根。总的来说是左—右—根   上图后序遍历结果为为:   代码如下: def BacOrder (

数据结构基础概念篇

半城伤御伤魂 提交于 2019-12-21 23:46:01
数据结构基础概念篇 原创 小草莓lllll 发布于2017-11-14 13:44:24 阅读数 158267 收藏 更新于2017-11-14 13:44:24 分类专栏: 数据结构与算法 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/qq_31196849/article/details/78529724 展开 <h1 id="数据结构"><a name="t0"></a><a name="t0"></a>数据结构</h1> 一些概念 数据结构就是研究数据的 逻辑结构 和 物理结构 以及它们之间 相互关系 ,并对这种结构定义相应的运算,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。 数据:所有能被输入到计算机中,且能被计算机处理的符号的集合。是计算机操作的对象的总称。 数据元素:数据(集合)中的一个“个体”,数据及结构中讨论的 基本 单位 数据项:数据的不可分割的最小单位。一个数据元素可由若干个数据项组成。 数据类型:在一种程序设计语言中,变量所具有的数据种类。整型、浮点型、字符型等等 逻辑结构:数据之间的相互关系。 集合 结构中的数据元素除了同属于一种类型外,别无其它关系。 线性结构 数据元素之间一对一的关系 树形结构 数据元素之间一对多的关系

二叉树的非递归遍历的思想

痴心易碎 提交于 2019-12-20 18:14:28
最近在学习数据结构,从书上的代码示例中学习到了一种抽象的思考方式,记录一些学习二叉树的感悟 先序遍历 先序遍历相对简单,我一开实现的时候考虑了四种情况 左孩子为空 && 右孩子为空 访问根节点,然后出栈 左孩子不为空 && 右孩子为空 访问根节点,然后继续访问左孩子 左孩子为空 && 右孩子不为空 访问根节点,入栈右孩子,出栈 左孩子不为空 && 右孩子不为空 访问根节点,入栈右孩子,继续访问左孩子 template<typename Elemtype> template<typename Fun> bool BiTree<Elemtype>::PreOrderTraverse(Fun &visit){ Stack<BiTNode<Elemtype>*> S; InitStack<bool,BiTNode<Elemtype>*>(S); BiTNode<Elemtype> *p = root; while (p != nullptr) { visit(p); if(p->rChrilde != nullptr) Push<bool,BiTNode<Elemtype>*>(S,p->rChrilde); if(p->lChrilde != nullptr) p = p->lChrilde; else //如果栈空Pop()返回false,用于判断栈空结束循环 if(!Pop<bool

go语言浅析二叉树

自作多情 提交于 2019-12-19 04:47:26
Hello,各位小伙伴大家好,我是小栈君,今天给大家带来的分享是关于关于二叉树相关的知识点,并用go语言实现一个二叉树和对二叉树进行遍历。 我们主要针对二叉树的概念,go实战实现二叉树的前序遍历、中序遍历、后序遍历。 二叉树概念 在计算机科学领域内,二叉树代表的是具有两个节点的树形结构,通常子树被称作为“左子树”,右边的被称作为“右子树”。二叉树通常的应用于实现二叉查找树和二叉堆。 例如上述图片中,我们就制定了一个二叉树,其中d、e、f称作a树的叶子节点。 [叶子结点是离散数学中的概念。一棵树当中没有子结点(即度为0)的结点称为叶子结点,简称“叶子”。 叶子是指出度为0的结点,又称为终端结点] b和c 作为树a的孩子结点,b和a因为作为一个根a的孩子,所以他们的称呼为兄弟结点。其实总结一点就是关于二叉树各个结点的称呼其实和我们在家庭中,对于各个亲戚长辈的称呼类似。 在百度百科中也归纳除了关于二叉树的分类 一棵深度为k,且有2^k-1个结点的二叉树,称为满二叉树。这种树的特点是每一层上的结点数都是最大结点数。而在一棵二叉树中,除最后一层外,若其余层都是满的,并且或者最后一层是满的,或者是在右边缺少连续若干结点,则此二叉树为完全二叉树。 具有n个结点的完全二叉树的深度为floor(log2n) 1。深度为k的完全二叉树,至少有2k-1个叶子结点,至多有2k-1个结点。