先序遍历

二叉树的遍历

醉酒当歌 提交于 2020-01-29 20:47:50
1、二叉树的广度遍历 2、二叉树的深度遍历 二叉树的深度遍历,包括了前序遍历、中序遍历、后续遍历。其命名方式是根节点的遍历顺序, 即:先序遍历:先遍历根节点(根节点->左子树->右子树),即先访问根节点再递归的访问左子树,然后递归的访问右子树。 中序遍历:访问的中间位置为根位置,其主要顺序为(左子树->根节点->右子树),即我们先递归的使用中序遍历访问左子树,让后根节点,然后递归的使用中序遍历访问右子树。 后序遍历:最后访问根节点(左子树->右子树->根节点),即我们先递归的使用后续遍历访问左子树,然后递归的使用后续遍历右子树,最后访问根节点 来源: CSDN 作者: lianchaozhao 链接: https://blog.csdn.net/weixin_40809627/article/details/104105319

二叉树的遍历.队列与栈实现

天大地大妈咪最大 提交于 2020-01-29 20:45:32
树的遍历方法有广度优先(层序遍历),以及深度优先两种方法,分成先序遍历,中序遍历,后序遍历三种。 一.深度优先: 1.递归实现: 先序遍历 输出顺序:根节点,左子树,右子树。 void PreOrderTraversal ( BinTree BT ) { if ( BT ) { //如果树非空 printf ( "%d" , BT - > Data ) ; //输出根节点 PreOrderTraversal ( BT - > Left ) ; //继续递归执行其左子树 PreOrderTraversal ( BT - > Right ) ; //继续递归其右子树 } } 中序输出:左子树,根节点,右子树。 只需要将输出语句放到两个递归语句之间即可。 void PreOrderTraversal ( BinTree BT ) { if ( BT ) { PreOrderTraversal ( BT - > Left ) ; printf ( "%d" , BT - > Data ) ; PreOrderTraversal ( BT - > Right ) ; } } 后序输出:左子树,右子树,根节点。 void PreOrderTraversal ( BinTree BT ) { if ( BT ) { PreOrderTraversal ( BT - > Left ) ;

二叉树遍历

ε祈祈猫儿з 提交于 2020-01-26 19:46:46
二叉树遍历 1.前序(先序):根 左 右 ==>A BDFE CGHI 2.中序:左 根 右 ==>D B EF A GH C I 3.后序:左 右 根 ==>DEFB GHIC A 错误笔记 :后序和中序都是从 左 ,这个左就是 最左边 这个数,不能单纯记为左下角这个数,我把他记成左下角这个数刚刚就产生了疑惑,图片里面这个D和E到底怎么安排,如果记为 最左边 就毫无疑惑是D。 遍历完左子树之后到了B结点这里,然后是到左下角,而不是最左边 4.层序:从上到下,从左到右 这个遍历的顺序是理解起来最简单的,但是代码实现起来却是最难的(个人观点),反正理解起来一定错不了, 从上到下,从左到右 。 A BC DEF GHI 代码实现 建立一个结构体链表来存储。 struct node { struct node * l ; //left struct node * r ; //right int data ; } ; 先序遍历: void xian ( struct node * t ) { if ( t == NULL ) return ; printf ( "%d" , t -> data ) ; //先输出结点data xian ( t -> l ) ; //遍历左子树 xian ( t -> r ) ; //遍历右子树 } 中序遍历: void zhong ( struct

用JavaScript刷LeetCode的正确姿势

爷,独闯天下 提交于 2020-01-25 18:09:52
虽然很多人都觉得前端算法弱,但其实 JavaScript 也可以刷题啊!最近两个月断断续续刷完了 leetcode 前 200 的 middle + hard ,总结了一些刷题常用的模板代码。 走过路过发现 bug 请指出,拯救一个辣鸡(但很帅)的少年就靠您啦! 常用函数 包括打印函数和一些数学函数。 const _max = Math.max.bind(Math); const _min = Math.min.bind(Math); const _pow = Math.pow.bind(Math); const _floor = Math.floor.bind(Math); const _round = Math.round.bind(Math); const _ceil = Math.ceil.bind(Math); const log = console.log.bind(console); //const log = _ => {} log 在提交的代码中当然是用不到的,不过在调试时十分有用。但是当代码里面加了很多 log 的时候,提交时还需要一个个注释掉就相当麻烦了,只要将 log 赋值为空函数就可以了。 举一个简单的例子,下面的代码是可以直接提交的。 // 计算 1+2+...+n // const log = console.log.bind(console);

树遍历和非递归

谁说胖子不能爱 提交于 2020-01-25 05:17:13
利用随机函数产生 80 个 ( 不大于 200 且各不相同的 ) 随机整数,用这些整数来生成一棵二树,分别对二叉树进行先序遍历,中序遍历和后序列遍历输出树中结点元素序列。注意:先序遍历输出要求采用非递归来实现。 ( 2 )程序实现的基本思想 1. 建立合适的二叉树 程序是以 图 1.1 的形式建立的。 2. 前序遍历是以 stack 栈和指针左右子女实现的。 3. 前序遍历,中序遍历,后序遍历分别用了递归实现。 4. 如建立二叉树,其中随机产生的数值是( 因为 80 个数比较多,所以就以 #define Max_size 10 ,若要以 80 个数,可 #define Max_size 10 改成 #define Max_size 80 ): 106 199 95 144 102 164 26 96 87 168 由以上数值可以建立出以下的树: 图 1.2 由图 1.2 可得出他们的前序,中序和后序。 前序序列: 106 95 26 87 102 96 199 144 164 168 中序序列: 26 87 95 96 102 106 144 164 168 199 后序序列: 87 26 96 102 95 168 164 144 199 106 ( 3 )系统流程图 程序步骤: #include "stdio.h" #include "conio.h" #define Max

Morris遍历遍历二叉树

孤街浪徒 提交于 2020-01-22 22:51:29
遍历二叉树的递归方法使用了函数栈,非递归方法使用了申请的栈, 两者的额外空间都与树的高度有关,所以空间复杂度为O(h),h为二叉树的高度。 可以使用二叉树叶子节点中大量指向null的指针实现空间复杂度O(1)的遍历。 Morris遍历的实质就是避免使用栈结构,让下层到上层有指针, 具 体是通过让底层节点指向null的空闲指针指回上层的某个节点,从而完成下层到上层的移动。 先序中序后序主要基于两个主要步骤,然后输出的位置有所不同,以中序遍历为例。 中序遍历: 1、假设当前子树的头节点为h,让h的左子树中最右节点的right指针指向h, 然后h的左子树继续步骤1的处理过程,直到遇到某一个节点没有左子树时记为node,进入步骤2。 2、从node开始通过每个节点的right指针进行移动并以此打印,假设移动到的节点为cur。 对每一个cur节点都判断cur节点的左子树中最右节点是否指向cur。 Ⅰ 如果是,令cur节点的左子树中最右节点的right指针指向null,即恢复树的本来面貌, 然后打印cur,继续通过cur的right指针移动到下一个节点。重复步骤2。 Ⅱ 如果不是,以cur为头的子树重回步骤1执行。 public void morrisIn(TreeNode root) { if (root == null) return; TreeNode cur1 = root;

二叉树非递归遍历的实现

◇◆丶佛笑我妖孽 提交于 2020-01-21 07:30:58
/*二叉树的遍历之非递归实现*/ /*非递归实现采用栈去模拟实现*/ //参考代码http://blog.csdn.net/ns_code/article/details/12977901 节点访问 1 void visit(BTNode*b) 2 { 3 //输出格式依赖于elementType 4 printf("%c",b->data); 5 } 先序遍历 根据先序遍历的顺序,先访问根节点,再访问左子树,后访问右子树,而对于每个子树来说, 又按照同样的访问顺序进行遍历。非递归的实现思路如下: 对于任一节点P, 1)输出节点P,然后将其入栈,再看P的左孩子是否为空; 2)若P的左孩子不为空,则置P的左孩子为当前节点,重复1)的操作; 3)若P的左孩子为空,则将栈顶节点出栈,但不输出,并将出栈节点的右孩子置为当前节点, 看其是否为空; 4)若不为空,则循环至1)操作; 5)如果为空,则继续出栈,但不输出,同时将出栈节点的右孩子置为当前节点,看其是否 为空,重复4)和5)操作; 6)直到当前节点P为NULL并且栈空,遍历结束。 void PreOrder(BTree bt) { PSTACK stack=NULL; stack=CreateStack(); //创建一个空栈 elementType node_pop; //用来保存出栈节点 elementType pCur=bt;

浅谈数据结构-二叉树

浪子不回头ぞ 提交于 2020-01-20 17:35:34
二叉树是树的特殊一种,具有如下特点:1、每个结点最多有两颗子树,结点的度最大为2。2、左子树和右子树是有顺序的,次序不能颠倒。3、即使某结点只有一个子树,也要区分左右子树。 一、特殊的二叉树及特点 1、斜树 所有的结点都只有左子树(左斜树),或者只有右子树(右斜树)。这就是斜树,应用较少 2、满二叉树 所有的分支结点都存在左子树和右子树,并且所有的叶子结点都在同一层上,这样就是满二叉树。就是完美圆满的意思,关键在于树的平衡。 根据满二叉树的定义,得到其特点为: 叶子只能出现在最下一层。 非叶子结点度一定是2. 在同样深度的二叉树中,满二叉树的结点个数最多,叶子树最多。 3、完全二叉树 对一棵具有n个结点的二叉树按层序排号,如果编号为i的结点与同样深度的满二叉树编号为i结点在二叉树中位置完全相同,就是完全二叉树。满二叉树必须是完全二叉树,反过来不一定成立。 其中关键点是按层序编号,然后对应查找。 在上图中,树1,按层次编号5结点没有左子树,有右子树,10结点缺失。树2由于3结点没有字数,是的6,7位置空挡了。树3中结点5没有子树。 上图就是一个完全二叉树。 结合完全二叉树定义得到其特点: 叶子结点只能出现在最下一层(满二叉树继承而来) 最下层叶子结点一定集中在左 部连续位置。 倒数第二层,如有叶子节点,一定出现在右部连续位置。 同样结点树的二叉树,完全二叉树的深度最小

二叉树的遍历与建立

主宰稳场 提交于 2020-01-20 07:00:03
内容简介 本次作业在二叉树的建立方面,我使用了先序输入的方法来建立,即使用递归来实现。在遍历输出方面,有先序、中序、和后序三种。 其中,本次建立二叉树时,输入结束的条件为输入数据为0。 本程序创建的二叉树如下: 相关代码: include using namespace std; typedef struct node//创建节点结构 { char data;//数据元素 struct node Lchild;//指向左孩子结点 struct node Rchild;//指向右孩子结点 }BinNode,*BinTree; void CreateTree(BinTree &T);//递归法建立二叉树 void PreOrder(BinTree &T);//先序遍历 void InOrder(BinTree &T);//中序遍历 void PostOrder(BinTree &T);//后序遍历 int main() { BinTree T; cout<<"请输入二叉树节点:"; CreateTree(T); cout<<"先序遍历:"; PreOrder(T); cout<<endl; cout<<"中序遍历:"; InOrder(T); cout<<endl; cout<<"后序遍历:"; PostOrder(T); cout<<endl; return 0; } void

树的建立及遍历

天涯浪子 提交于 2020-01-20 05:39:08
内容简介 本次作业在建立二叉树方面,使用了先序输入建立的方法(递归实现)。在遍历输出方面,有先序/中序/后序遍历三种。 其中,本次建立二叉树时,输入结束的条件为输入数据为'.'。 用链式结构存储,生成的树大体如上图 二叉树的建立 树的结构体 typedef struct dfs *tree; struct dfs { tree lchild ,rchild; char data; }; 按先序输入建立二叉树 tree DFS() { char m; cin>>m; tree father; father=new struct dfs; if(m=='.') father = NULL; else { father->data=m; father->lchild=DFS(); father->rchild=DFS(); } return father; } 这里用递归法创建树,每次递归返回父节点指针,当碰到表示为空的'.'时,使父节点为空。先序输入建立二叉树是从根节点出发, 先建立每个父节点的左孩子,当没有左孩子时依次返回建立每个父节点右孩子,直至最后一个右孩子被创建,返回所有父节点, 生成一棵二叉树。 二叉树的遍历 1.先序遍历 思路:先访问根结点 -> 遍历左子树 -> 遍历右子树;先访问根结点 void frontorder(tree root) { if(root) {