[算法] 二叉树的 先序遍历、中序遍历、后序遍历

二叉树遍历 例如,“DBACEGF ABCDEFG”,通过先序遍历知道根节点为D,根据中序遍历可知,左子树中序遍历为ABC,右子树中序遍历为EFG,然后通过先序遍历得到左右子树的先序遍历(BAC、EGF)和根节点D的左右节点(B、E),继续对左右子树(“BAC ABC”、“EGF EFG”)进行上述操作,直至结束。基于先序序列和中序序列的节点数目相同,得到k-il=x-pl,所以x=k-il+pl,那么左子树先序序列[pl+1,k-il+pl];注意:访问根,先序遍历左子树,左子树为空或已遍历才可以遍历右子树。 阅读详情

本文根据清华大学邓俊辉老师课程《数据结构》总结,课程地址 。

遍历介绍

按照事先约定的某种规则或次序,对节点各访问一次而且仅一次。与向量和列表等线性结构一样,二叉树的这类访问也统称为遍历(traversal)。

二叉树本身并不具有天然的全局次序, 故为实现遍历,需通过在各节点与其孩子之间约定某种局部次序, 间接地定义某种全局次序。

按惯例左兄弟优先于右兄弟, 若记做节点 V ,及其左、右孩子 L 和 R ,则下图所示,局
部访问的次序可有 V L R 、 L V R 和 L R V 三种选择。根据节点 V 在其中的访问次序,三种策略也相应地分别称作 先序遍历、中序遍历 和 后序遍历 。

这里写图片描述

可以根据节点 V 次序位置进行记忆,先序遍历中 V 位于前端,中序遍历中 V 位于中间,后序遍历中 V 位于后端。

下面说一下各个遍历的迭代式实现。

先序遍历

通过先序遍历操作后,返回结果的顺序如下图所示。 注意下图是最终返回的结果展示顺序,实现方法及流程并非如此。

先序遍历返回结果

C++ 实现代码如下:

//从当前节点出发,沿左分支不断深入,直至没有左分支的节点,沿途节点遇到后立即访问
template <typename T, typename VST> //元素类型、操作器
static void visitAlongLeftBranch(BinNodePosi(T) x, VST& visit, Stack<BinNodePosi(T)>& S) {
	while (x) {
		visit(x->data); //访问当前节点
		S.push(x->rChild); //右孩子入栈暂存(可优化:通过判断,避免空的右孩子入栈)
		x = x->lChild; //沿左分支深入一层
	}
}

template <typename T, typename VST> //元素类型、操作器
void travPre_I2(BinNodePosi(T) x, VST& visit) { //二叉树先序遍历算法(迭代版)
	Stack<BinNodePosi(T)> S; //辅助栈
	while (true) {
		visitAlongLeftBranch(x, visit, S); //从当前节点出发,逐批访问
		if (S.empty()) break; //直到栈空
		x = S.pop(); //弹出下一批的节点
	}
}

根据上面的代码,举个例子。

先序遍历实现流程

上图所示的二叉树遍历,流程描述如下:

  1. 从节点 a 出发,沿左分支不断深入,直至没有左分支的节点,沿途节点遇到后立即访问。首先 a 的右节点 c 直接进栈,然后访问左节点 b;
  2. b 的右节点直接进栈,此时其为空节点,所以空节点进栈,访问 b 的左节点,也为空,直接进行下一步;
  3. 弹出栈顶空节点,再弹出 c,将 c 的右节点 f 直接进栈,并访问左节点 d;
  4. 将 d 的右节点 e 直接进栈,并访问左节点 ;
  5. d 的左节点为空。接下来弹出栈顶的 e ,并将 e 的右节点(空节点)直接进栈,访问 e 的左节点;
  6. e 的左节点为空。接下来弹出栈顶的 f ,并将 f 的右节点(空节点)直接进栈,访问 f 的左节点 g ;
  7. 将 g 的右节点(空节点)直接进栈, 访问 g 的左节点;
  8. g 的左节点为空。弹出g 的右节点(空节点),再弹出 f 的右节点(空节点);
  9. 栈为空,遍历结束。(其实上述描述的每一次循环都会做一次栈是否为空的检查)

中序遍历

通过中序遍历操作后,返回结果的顺序如下图所示。
同样需注意下图是最终返回的结果展示顺序,实现方法及流程并非如此。

中序遍历返回结果

C++ 实现代码如下:

template <typename T> //从当前节点出发,沿左分支不断深入,直至没有左分支的节点
static void goAlongLeftBranch(BinNodePosi(T) x, Stack<BinNodePosi(T)>& S) {
	while (x) { S.push(x); x = x->lChild; } //当前节点入栈后随即向左侧分支深入,迭代直到无左孩子
}

template <typename T, typename VST> //元素类型、操作器
void travIn_I1(BinNodePosi(T) x, VST& visit) { //二叉树中序遍历算法(迭代版)
	Stack<BinNodePosi(T)> S; //辅助栈
	while (true) {
		goAlongLeftBranch(x, S); //从当前节点出发,逐批入栈
		if (S.empty()) break; //直至所有节点处理完毕
		x = S.pop(); visit(x->data); //弹出栈顶节点并访问之
		x = x->rChild; //转向右子树
	}
}

根据上面的代码,举个例子。

中序遍历实现流程

上图所示的二叉树遍历,流程描述如下:

  1. 从节点 b 出发, b 进栈 S。沿左分支不断深入,遇到节点则入栈;
  2. 直至所有左分支节点处理完毕。(此时 S 中从上往下为 a、b);
  3. 弹出栈 S 顶节点 a 并访问之;
  4. 转向 a 右子树。到此处截止,为一个循环体操作。接下来对 a 右子树,对其重复循环体类似操作;
  5. 但这里a 右子树为空,所以继续弹出 b 。转向 b 右子树,对其进行重复循环体类似操作;
  6. 所以 f、d、c 依次入栈,c 在栈顶。弹出 c ,转向 c 右子树,重复循环体;
  7. c 右子树为空。弹出 d ,转向 d 右子树,重复循环体。
  8. e 入栈,弹出 e ,转向 c 右子树,重复循环体,c 右子树为空;
  9. 弹出 f,转向 f 右子树,重复循环体。
  10. g 入栈, g 出栈,转向 g 右子树,为空;
  11. 此时,没有新的节点入栈,栈中也没有其他节点,终止遍历操作。

后序遍历

通过后序遍历操作后,返回结果的顺序如下图所示。

后序遍历返回结果

C++ 实现代码如下:

template <typename T> //在以S栈顶节点为根的子树中,找到最高左侧可见叶节点
static void gotoHLVFL(Stack<BinNodePosi(T)>& S) { //沿途所遇节点依次入栈
	while (BinNodePosi(T) x = S.top()) //自顶而下,反复检查当前节点(即栈顶)
		if (HasLChild(*x)) { //尽可能向左
			if (HasRChild(*x)) S.push(x->rChild); //若有右孩子,优先入栈
			S.push(x->lChild); //然后才转至左孩子
		} else //实不得已
			S.push(x->rChild); //才向右
	S.pop(); //返回之前,弹出栈顶的空节点
}

template <typename T, typename VST>
void travPost_I(BinNodePosi(T) x, VST& visit) { //二叉树的后序遍历(迭代版)
	Stack<BinNodePosi(T)> S; //辅助栈
	if (x) S.push(x); //根节点入栈
	while (!S.empty()) {
		if (S.top() != x->parent) //若栈顶非当前节点之父(则必为其右兄),此时需
			gotoHLVFL(S); //在以其右兄为根之子树中,找到HLVFL(相当于递归深入其中)
		x = S.pop(); visit(x->data); //弹出栈顶(即前一节点之后继),并访问之
	}
}

根据上面的代码,举个例子。

后序遍历实力流程1

  1. 找到最高左侧可见叶节点 k,若有右子树优先入栈(此处为 j),但优先往左子树方向走(i 入栈);
  2. i 的右子树 h 入栈,i 无左子树,所以继续对右子树 h 进行操作;
  3. h 的右子树 g 入栈,方向到左子树(b 入栈);
  4. b 的右子树 a 入栈,b 无左子树。继续对 a 进行操作,a 无子节点;
  5. 到此为止,第一次入栈操作结束,此时栈中顶而下依次为 abghijk;
  6. 接下来弹出栈顶元素 a ,访问之;
  7. b 是 a 的父节点,不用进行 入栈操作。弹出栈顶元素 b ,访问之;
  8. 接下来是 g ,非 b 的父节点,执行入栈操作,按照1~5步骤说的方法,依次将 fedc 入栈;

后序遍历实力流程2

  1. 接下来判断是否需要执行入栈,并不断从栈中弹出节点,并访问之;
  2. 最后,栈为空,遍历结束。
数据结构——二叉树层序遍历 来喽来喽~ 二叉树的层序遍历来喽~层序遍历那是相当有趣滴!我的朋友,请不要迷惘,你要记住,你终有鲲鹏一日!加油吧!从现在开始~不知道有没有难住你呢!相信你不会被这些小困难绊倒!说给你,更说给我,现在的努力至少不会辜负这一点青春时光! 阅读详情

相关推荐

二叉树的基本操作(先序序列创建二叉树/先序遍历递归算法/中序遍历递归算法/后序遍历递归算法/求二叉树深度的递归算法)

二叉树的存储结构有顺序存储和链式存储两种存储方式,这里我们采用使用频率较高的链式存储方式(二叉链表)来存储二叉树. 下面给出二叉树结点的定义. struct BiTreeNode//二叉树结点定义 { BiTreeNode* LChild;//左孩子指针域 int data; BiTreeNode* RChild;//右孩子指针域 }; ...

weixin_42048463的博客 4853

数据结构--二叉树遍历(详细过程)

详细到啰嗦的程度,完全0基础都可完成。

m0_56283131的博客 4万+

Java学习手册:(数据结构与算法-二叉树)已知先序遍历和中序遍历,如何求后序遍历?

算法思想:已知先序遍历和中序遍历,如何求后序遍历?(1)确定树的根结点。树根是当前树中所有元素在先序遍历中最先出现的元素,即先序遍历的第一个结点就是二叉树的根。(2)求解树的子树。找到根在中序遍历的位置,位置左边是二叉树的左孩子,位置右边是二叉树的右孩子,如果根结点左边或右边为空,那么该方向子树为空;如果根结点左边和右边都为空,那么根结点已经成为叶子结点。(3)对二叉树的左、右孩子分别进行步骤(1...

浩比的专栏 1060

二叉树的五种遍历方式

目录 1、前序遍历 (1)递归实现前序遍历 (2)非递归实现前序遍历 2、中序遍历 (1)递归实现中序遍历 (2)非递归实现中序遍历 3、后序遍历 (1)递归实现后序遍历 (2)非递归实现后序遍历 4、层序遍历 二叉树是一种重要的数据结构,其遍历方式分为:深度遍历和广度遍历,深度遍历有前序、中序以及后序三种遍历方法,广度遍历即就是层次遍历。如下图: class TreeNode{ int val; TreeNode left; TreeNode ..

weixin_47382783的博客 1万+

算法:二叉树的先序遍历、中序遍历、后序遍历(递归及非递归方式)的java代码实现

首先来看一棵二叉树: 1、前序遍历: 前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。 若二叉树为空则结束返回,否则: (1)访问根结点; (2)前序遍历左子树; (3)前序遍历右子树 ; 需要注意的是:遍历左右子树时仍然采用前序遍历方法。可以看出前序遍

宋伟的专栏 1万+

实现二叉树的先序遍历、中序遍历、后序遍历的递归非递归算法以及层次遍历算法

#include"iostream" #define maxsize 50 using namespace std; class node{ private: char data; node* lchild; node* rchild; public: void createnode(node *&,char *); void fnode(node* b) { if(b!=NULL

Stay hungry 4755

二叉树先序遍历、中序遍历、后序遍历的递归算法与非递归算法

首先是二叉树数据结构的定义: typedef struct TNode *Position; typedef Position BinTree; /* 二叉树类型 */ struct TNode{ /* 树结点定义 */ int Data; /* 结点数据 */ BinTree Left; /* 指向左子树 */ BinTree Right; /* 指向右...

弱爆了的雪饼的博客 6367

二叉树的遍历(七种方法)

本章主要通过运用递归与非递归方法分别对二叉树进行遍历 主要分先序遍历、中序遍历、后序遍历以及层次遍历四种情况进行讨论

AIGC 1万+

二叉树的遍历(先序遍历,中序遍历,后序遍历)递归与非递归算法

二叉树的遍历算法,前序遍历,中序遍历,后续遍历。算法的分析和实现(递归和非递归)

Tianzhenchuan的博客 989

别再被无限debugger卡住了!Chrome DevTools实战绕过技巧(含Hook与文件替换)

本文详细介绍了如何通过Chrome DevTools绕过无限debugger封锁的实战技巧,包括Hook技术与文件替换方法。针对常见的定时器轰炸、循环陷阱和动态注入等反调试手段,提供了高效的解决方案,帮助开发者快速突破调试障碍,提升爬虫和逆向工程效率。

weixin_30326515的博客 241

Mac电脑本地安装Stable Diffusion小白教程避开所有坑教程

如果出现黄字部分警告,如WARNING: The scripts pip, pip3 and pip3.9 are installed inz‘/usr/local/opt/python@3.9/Frameworks/Python.framework/Versions/3.9/bin’ which is not on PATH)需要将其添加到path。下载pip,输入:curl https://bootstrap.pypa.io/pip/get-pip.py -o get-pip.py。

jackerjin123的博客 1799

【算法】【二叉树模块】通过先序遍历和中序遍历获取后序遍历数组(不重构二叉树)

不重构二叉树的情况下通过先序中序遍历获取后续遍历

qq_39760347的博客 393

如何利用GMS构建地下水数值模拟模型?

第一步:点图中三维网格的图标然后点Grid→Create Grid这个界面是用于创建一个有限差分网格的设置窗口。它允许你定义网格在三维空间中的范围、分辨率以及其他相关属性。这个界面提供了一个直观的方式来定义一个三维的有限差分网格,你需要指定每个维度上的范围、划分的单元格数量,以及一些控制单元格大小分布和网格方向的参数。这个网格通常会被用于数值模拟,例如地下水流模拟。在点击 "OK" 之前,请务必仔细检查所有参数是否符合你的建模需求。1. X-Dimension (X 轴维度)2. Y-Dimension (

weixin_44259522的博客 2091

二叉树先序遍历、中序遍历、后序遍历 递归和非递归算法

一、二叉树先序遍历 (1)递归算法 // 递归先序遍历 public static void recursionPreorderTraversal(TreeNode root) { if (root != null) { System.out.print(root.val + " "); recursionPreorderTraversal(root.left); recursionPreorderTraversal(root.right);

qq_43170213的博客 3510

BurpSuite实战:5分钟搞定Pikachu靶场表单爆破(附最新字典配置技巧)

本文通过Pikachu靶场实战,详细演示了如何使用BurpSuite的Intruder模块对Web登录表单进行暴力破解。从代理配置、请求捕获、集束炸弹模式设置,到载荷配置与结果分析,提供了完整的操作流程。文中还分享了2024年有效的字典获取与优化技巧,帮助安全测试人员快速定位弱口令漏洞。

weixin_29327977的博客 597

pt100和max31865测室温跳变比较大,会从23.04跳到23.47,23.75反复跳变超过了0.5的误差范围,在VDD和GND之间加上0.1和10的滤波电容也不行,如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 2087

二叉树的递归与非递归方式的先序、中序、后序、层序遍历算法(Java版本)

介绍 本文提供了二叉树的构造、递归与非递归方式的遍历算法,其中递归方式较为简单。但在实际应用中,递归的遍历方式适用于递归深度不高的算法中,其一般使用非递归方式来解决。 二叉树建树 实验一:输入测试数据序列:A B # D # # C # # 构造二叉树示意图: 非递归遍历二叉树的原理 递归方式遍历二叉树较为简单,本文不做过多描述。非递归方式需要用到栈作为辅助数据结构来实现,非递归遍历二叉...

qq_25956141的博客 2112

《UDS协议从入门到精通(UDS速查手册)》(完结撒花版)

专栏总目录,文中介绍了UDS协议相关的基础知识和一些术语,给出了详细介绍6大类26种服务的跳转目录。

车载系统攻城狮 9万+

小小c#算法题 - 11 - 二叉树的构造及先序遍历、中序遍历、后序遍历

在上一篇文章 小小c#算法题-10-求树的深度中,用到了树的数据结构,树型结构是一类重要的非线性数据结构,树是以分支关系定义的层次结构,是n(n>=0)个结点的有限集。但在那篇文章中,只是简单地把结点组合到了一块。 这次,我们来简单定义一棵二叉树的数据结构,并实现其先序(根)遍历、中序(根)遍历、后序(根)遍历算法。 下面先来看一下先序遍历,中序遍历...

weixin_33982670的博客 499

小红书urlscheme和Activity

本文档详细介绍了小红书App的Deeplink跳转规范,涵盖了多个功能模块的跳转协议。主要内容包括:主页各Tab(关注、发现、购买)的跳转方式;不同类型笔记(图文/视频/长笔记)的详情页跳转参数;用户相关页面(主页/绑定/资料/消息等)的跳转协议;搜索功能(输入页/结果页)的跳转方式;以及话题、标签、专辑、H5页面等特殊场景的跳转实现。文档还提供了各跳转协议所需的参数说明,包括参数类型、默认值、是否必填等详细信息,并标注了不同版本和平台的兼容性要求。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 785

【WorkBuddy专栏09】WorkBuddy多模态能力深度揭秘

【WorkBuddy专栏09】AI不止会聊天——WorkBuddy多模态能力深度揭秘

AI人人懂 2105

建立二叉树,实现二叉树的先序遍历、中序和后序遍历的非递归算法

先序遍历:若二叉树为空,则空操作;否则访问根节点;先序遍历左子树;先序遍历右子树。 中序遍历:若二叉树为空,则空操作;否则中序遍历左子树;访问根节点;中序遍历右子树。 后序遍历:若二叉树为空,则空操作;否则后序遍历左子树;后序遍历右子树;访问根节点。/* * Created by Microsoft Visual Studio 2013 * @author: Teresa * @date: 20

Teresa0312的博客 4714

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【数据结构笔记10】二叉树的先序、中序、后序遍历,中序遍历的堆栈/非递归遍历算法,层序遍历,确定一个二叉树,树的同构

就二叉树的基础遍历方法展开,最后落到树的同构检验实现上。

记录学习痕迹的公众号:Piper蛋窝 1291

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

有趣的数据结构算法15——二叉树的先序遍历、中序遍历和后序遍历

有趣的数据结构算法15——二叉树的先序遍历、中序遍历和后序遍历遍历的种类深度遍历的实现先序遍历中序遍历后序遍历实现代码GITHUB下载连接 创建完二叉树了,真的猛士就应该开始遍历了! 遍历的种类 二叉树是一种非常重要的数据结构。对于二叉树,存在深度遍历和广度遍历两种类的便利结构。 深度遍历有前序遍历、中序遍历以及后序遍历三种遍历方法, 广度遍历代表的是常见的层次遍历。 对于深度遍历而言,结合树的...

Bubbliiiing的学习小课堂 4516

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

白话解释 DFS 与 BFS 算法 (二叉树的先序遍历,中序遍历、后序遍历、层次遍历)

DFS 与 BFS一、BFS1.1 什么是 BFS二、DFS2.1 什么是 DFS 一、BFS 1.1 什么是 BFS BFS(Breadth First Search) 即广度优先搜索,在数和图中非常常见 二、DFS 2.1 什么是 DFS DFS 即深度优先搜索,同 BFS,在树和图中也是非常常见的 ...

欢迎来到Gorit的博客 1万+

JavaScript实现:二叉树的遍历算法,包括先序遍历、中序遍历和后序遍历

的JavaScript实现:二叉树的遍历算法,包括先序遍历、中序遍历和后序遍历

阿牛哥的博客 613
上一篇: [算法] 递归方程 减而治之 分而治之
下一篇: 【CNN】理解卷积神经网络中的通道 channel
scxyz_
博客等级 码龄10年 304粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值