二叉排序树C++实现

【C++、数据结构】二叉排序树(二叉查找树、二叉搜索树)(图解+完整代码) 二叉搜索树/二叉排序树/二叉查找树:创建、插入、查找、删除(非递归以及递归版本代码),以及超详细步骤图解 阅读详情

二叉排序树定义

二叉排序树又称二叉查找树,它或者是一棵空的二叉树,或者是具有下列性质的二叉树:
(1)若它的左子树不空,则左子树上所有结点的值均小于根结点的值;

(2)若它的右子树不空,则右子树上所有结点的值均大于根结点的值;

(3)它的左右子树也都是二叉排序树。

树节点类定义

//树节点类
class TNode {
public:
	int data;
	TNode* left, * right;
	TNode(int d) :left(nullptr), right(nullptr), data(d) {}
	TNode() :left(nullptr), right(nullptr) {}
};

二叉排序树类定义

实现了树的生成,新节点插入,旧结点删除的功能。

//二叉排序树
class BinarySortTree
{
public:
	BinarySortTree(int a[],int n);//构造函数
	~BinarySortTree();//析构

	void Insert(int value);//插入新节点
	void Delete(int value);//删除节点

	void PreOrder();//前序遍历
	void InOrder();//中序遍历,这两个遍历是为了确定树的形状是否正确
private:
	void _del(TNode* cur);
	void _pre(TNode* cur);
	void _in(TNode* cur);
	TNode* root;//根结点
};

树的生成和析构

//构造函数
BinarySortTree::BinarySortTree(int a[], int n)
{
	for (int i = 0; i < n; i++)
		Insert(a[i]);
}
//析构
BinarySortTree::~BinarySortTree()
{
	if(root!=nullptr)
		_del(root);
}

void BinarySortTree::_del(TNode* cur)
{
	if (cur->left == nullptr && cur->right == nullptr) return;
	if (cur->left) _del(cur->left);
	if (cur->right) _del(cur->right);

节点插入

主要思路就是寻找需要插入的位置的指针cur

//插入新节点
void BinarySortTree::Insert(int value)
{
	if (root==nullptr){//当为空树时
		root = new TNode(value);
		return;
	}
	TNode* cur = root;//记录当前指针位置
	TNode* prev = nullptr;//记录当前指针的前继,初始为空指针
	TNode* newNode = new TNode(value);//创建新节点
	while (cur) {//使cur位移到空指针处,那么它的前继就是我们需要插入新节点的地方
		if (cur->data > value) {
			if (cur->left) {
				prev = cur;
				cur = cur->left;
			}
			else {//这种情况应该只存在在初始化时,根结点的左右孩子节点至少存在一个为空时可能会跳转进来
				cur->left = newNode;
				return;
			}
		}
		if (cur->data <= value) {
			if (cur->right) {
				prev = cur;
				cur = cur->right;
			}
			else {
				cur->right = newNode;
				return;
			}
		}
	}
	//当当前结点为空时,在前继结点处插入
	if (prev->data > value)
		prev->left = newNode;
	else
		prev->right = newNode;
}

节点删除

分为两部分变成,第一部分,寻找与value值相等的cur指针,第二部分执行删除操作。

删除的方法是:

从某个子树中找出一个结点s,其值能代替cur的值,这样,就可以用点s的值去替换结点cur的值,再删除结点s。

这个值应该是大于结点cur的最小者(或者小于结点cur的最大者)。

伪代码

1,若结点cur是叶子,则直接删除结点cur;
2,若结点cur只有左子树,则只需重接cur的左子树;若结点cur只有右子树,则只需重接cur的右子树;
3,若结点cur的左右子树均不空,则
      3.1 查找结点cur的右子树上的最左下结点cur以及结点cur的双亲结点temp;
      3.2 将结点s数据域替换到被删结点cur的数据域;
      3.3若结点cur的右孩子无左子树,则将cur的右子树接到par的右子树上否则,将s的右子树接到结点cur的左子树上;
      3.4 删除结点s;

该伪代码仅仅举了一种情况,即cur节点的前继节点prev的左孩子节点的情况,而下面的程序都考虑到了所有情况。其实删除的操作比较麻烦的部分是当cur节点的左右子树都不为空时的情况,需要找到一个值应大于结点cur的最小者(或者小于结点cur的最大者)来代替cur的值。

 

//删除节点,假定一定存在这个节点
void BinarySortTree::Delete(int value)
{
	if (root == nullptr) return;
	TNode* cur = root;//记录当前指针位置
	TNode* prev = nullptr;//记录当前指针的前继,初始为空指针
	while (cur){//使cur位移到cur->data=value处
		if (cur->data > value) {
			if (cur->left) {
				prev = cur;
				cur = cur->left;
			}
		}
		else if (cur->data < value) {
			if (cur->right) {
				prev = cur;
				cur = cur->right;
			}
		}
		else if (cur->data == value)
			break;
	}



	if (prev == nullptr) { delete root; return; }//说明此时只有根结点符合要求
	if (cur->left == nullptr && cur->right == nullptr) {//当cur为叶子结点时
		if (prev->left == cur)
			prev->left = nullptr;
		else if (prev->right == cur)
			prev->right = nullptr;
		delete cur;
		return;
	}
	else if (cur->left && cur->right == nullptr) {//当cur的左孩子存在,右孩子不存在时
		if (prev->left == cur)
			prev->left = cur->left;
		else if (prev->right == cur)
			prev->right = cur->left;
		delete cur;
		return;
	}
	else if (cur->left == nullptr && cur->right) {//当cur的左孩子不存在,右孩子存在时
		if (prev->left == cur)
			prev->left = cur->right;
		else if (prev->right == cur)
			prev->right = cur->right;
		delete cur;
		return;
	}
	else if (cur->left && cur->right) {//左右孩子都存在时
		if (prev->left == cur) {//当cur为prev的左子树时,寻找cur右孩子节点中最左边的叶节点
			TNode* temp = cur;
			TNode* s = cur->right;
			while (s->left != nullptr) {
				temp = s;
				s = s->left;
			}
			cur->data = s->data;
			if (temp == cur) temp->right = s->right;//当temp未发生移动时,此时即cur的右孩子为叶子结点
			else temp->left = s->right;//temp发生了移动,此时要删除s节点
			delete s;
			return;
		}
		else if (prev->right == cur) {//当cur为prev的右子树时,寻找cur左孩子节点中最右边的叶节点
			TNode* temp = cur;
			TNode* s = cur->left;
			while (s->right!=nullptr)
			{
				temp = s;
				s = s->right;
			}
			cur->data = s->data;
			if (temp == cur) temp->left = s->left;
			else temp->right = s->left;
			delete s;
			return;
		}
	}
}

全部代码

BinarySortTree.h

#pragma once
#ifndef BINARYSORTTREE_H
#define BINARYSORTTREE_H
#include<iostream>
using std::cout;
using std::endl;
//树节点类
class TNode {
public:
	int data;
	TNode* left, * right;
	TNode(int d) :left(nullptr), right(nullptr), data(d) {}
	TNode() :left(nullptr), right(nullptr) {}
};

//二叉排序树
class BinarySortTree
{
public:
	BinarySortTree(int a[],int n);//构造函数
	~BinarySortTree();//析构

	void Insert(int value);//插入新节点
	void Delete(int value);//删除节点

	void PreOrder();//前序遍历
	void InOrder();//中序遍历,这两个遍历是为了确定树的形状是否正确
private:
	void _del(TNode* cur);
	void _pre(TNode* cur);
	void _in(TNode* cur);
	TNode* root;//根结点
};

//构造函数
BinarySortTree::BinarySortTree(int a[], int n)
{
	for (int i = 0; i < n; i++)
		Insert(a[i]);
}
//析构
BinarySortTree::~BinarySortTree()
{
	if(root!=nullptr)
		_del(root);
}

//插入新节点
void BinarySortTree::Insert(int value)
{
	if (root==nullptr){//当为空树时
		root = new TNode(value);
		return;
	}
	TNode* cur = root;//记录当前指针位置
	TNode* prev = nullptr;//记录当前指针的前继,初始为空指针
	TNode* newNode = new TNode(value);//创建新节点
	while (cur) {//使cur位移到空指针处,那么它的前继就是我们需要插入新节点的地方
		if (cur->data > value) {
			if (cur->left) {
				prev = cur;
				cur = cur->left;
			}
			else {//这种情况应该只存在在初始化时,根结点的左右孩子节点至少存在一个为空时可能会跳转进来
				cur->left = newNode;
				return;
			}
		}
		if (cur->data <= value) {
			if (cur->right) {
				prev = cur;
				cur = cur->right;
			}
			else {
				cur->right = newNode;
				return;
			}
		}
	}
	//当当前结点为空时,在前继结点处插入
	if (prev->data > value)
		prev->left = newNode;
	else
		prev->right = newNode;
}

//删除节点,假定一定存在这个节点
void BinarySortTree::Delete(int value)
{
	if (root == nullptr) return;
	TNode* cur = root;//记录当前指针位置
	TNode* prev = nullptr;//记录当前指针的前继,初始为空指针
	while (cur){//使cur位移到cur->data=value处
		if (cur->data > value) {
			if (cur->left) {
				prev = cur;
				cur = cur->left;
			}
		}
		else if (cur->data < value) {
			if (cur->right) {
				prev = cur;
				cur = cur->right;
			}
		}
		else if (cur->data == value)
			break;
	}
	if (prev == nullptr) { delete root; return; }//说明此时只有根结点符合要求
	if (cur->left == nullptr && cur->right == nullptr) {//当cur为叶子结点时
		if (prev->left == cur)
			prev->left = nullptr;
		else if (prev->right == cur)
			prev->right = nullptr;
		delete cur;
		return;
	}
	else if (cur->left && cur->right == nullptr) {//当cur的左孩子存在,右孩子不存在时
		if (prev->left == cur)
			prev->left = cur->left;
		else if (prev->right == cur)
			prev->right = cur->left;
		delete cur;
		return;
	}
	else if (cur->left == nullptr && cur->right) {//当cur的左孩子不存在,右孩子存在时
		if (prev->left == cur)
			prev->left = cur->right;
		else if (prev->right == cur)
			prev->right = cur->right;
		delete cur;
		return;
	}
	else if (cur->left && cur->right) {//左右孩子都存在时
		if (prev->left == cur) {//当cur为prev的左子树时,寻找cur右孩子节点中最左边的叶节点
			TNode* temp = cur;
			TNode* s = cur->right;
			while (s->left != nullptr) {
				temp = s;
				s = s->left;
			}
			cur->data = s->data;
			if (temp == cur) temp->right = s->right;//当temp未发生移动时,此时即cur的右孩子为叶子结点
			else temp->left = s->right;//temp发生了移动,此时要删除s节点
			delete s;
			return;
		}
		else if (prev->right == cur) {//当cur为prev的右子树时,寻找cur左孩子节点中最右边的叶节点
			TNode* temp = cur;
			TNode* s = cur->left;
			while (s->right!=nullptr)
			{
				temp = s;
				s = s->right;
			}
			cur->data = s->data;
			if (temp == cur) temp->left = s->left;
			else temp->right = s->left;
			delete s;
			return;
		}
	}
}

void BinarySortTree::PreOrder()
{
	if (root) _pre(root);
}

void BinarySortTree::InOrder()
{
	if (root) _in(root);
}

void BinarySortTree::_del(TNode* cur)
{
	if (cur->left == nullptr && cur->right == nullptr) return;
	if (cur->left) _del(cur->left);
	if (cur->right) _del(cur->right);
}

void BinarySortTree::_pre(TNode* cur)
{
	if (cur == nullptr) return;
	cout << cur->data << " ";
	_pre(cur->left);
	_pre(cur->right);
}

void BinarySortTree::_in(TNode* cur)
{
	if (cur == nullptr) return;
	_in(cur->left);
	cout << cur->data << " ";
	_in(cur->right);
}

#endif // !BINARYSORTTREE_H

main.cpp

#include"BinarySortTree.h"


int main()
{

	int a[] = { 1,23,2,4,12,0,3,6 };
	BinarySortTree mytree(a, 8);
	mytree.PreOrder();
	cout << endl;
	mytree.InOrder();
	cout << endl;
	
	mytree.Delete(0);
	mytree.PreOrder();
	cout << endl;
	mytree.InOrder();
	cout << endl;
	return 1;
}

 

C++ 实现二叉排序树(二叉查找树) C++ 实现二叉排序树(二叉查找树) 二叉排序树( Binary Sort Tree),又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树。 若它的左子树不空,则左子树上所有结点的值均小于它的根结构的值; 若它的右子树不空,则右子树上所有结点的值均大于宫的根结点的值; 它的左、右子树也分别为二叉排序树。 查找、插入与生成操作 #include <iostream&... 阅读详情

相关推荐

【实战指南】EC-Engineer中ESI配置与PDO Mapping全流程解析

本文详细解析了EC-Engineer中ESI配置与PDO Mapping的全流程操作,包括环境准备、ESI文件导入技巧、在线配置细节及故障处理。特别强调了WinPcap驱动的兼容性问题和PDO Mapping的最佳实践,帮助工程师高效完成EtherCAT总线配置,适用于工业自动化领域的伺服控制与运动协同场景。

weixin_28730927的博客 394

[c++]二叉排序树(Binary Sort Tree)详解

二叉树是一种很基础的数据结构,而二叉排序树则是一种插入,删除,查找效率都不错的一种数据结构。二叉排序树的特性就是左子树键值小于根,右子树键值大于根,所以二叉排序树就天然的具有查找功能,有时二叉排序树又叫二叉搜索树或者二叉查找树。

EQUINOX1的博客 1256

MTK Sensor驱动调试实战:从AP到SCP的完整流程解析

本文详细解析了MTK平台Sensor驱动从AP侧到SCP侧的完整调试流程。内容涵盖AP侧驱动集成、DTS配置、内核编译与验证,以及SCP侧Tinysys框架下的代码集成、Overlay配置与I2C设置等核心步骤,并分享了中断唤醒、功耗优化及传感器数据校准等实战经验与常见问题排查方法,为硬件驱动工程师提供了一份全面的实战指南。

weixin_29175469的博客 351

C++——二叉树排序树

1 二叉搜索树概念 2 二叉搜索树操作与模拟实现 2.1 二叉搜索树的查找 非递归版本 递归版本 2.2 二叉搜索树的插入 非递归版本 递归版本 2.3 二叉搜索树的删除 非递归版本 递归版本 3 二叉搜索树的应用(K模型、KV模型) 4 二叉搜索树的性能分析

博主qq1077644249 1511

Visio 2013安装遇阻?手把手教你搞定注册表权限错误1402(附64位系统特殊处理)

本文详细解析了Visio 2013安装过程中常见的注册表权限错误1402问题,特别是在64位系统下的特殊处理方法。通过分步指导如何修改注册表权限、处理Wow6432Node分支以及使用高级工具如subinacl,帮助用户顺利完成安装并避免常见连带问题。

t8u9v0w1x的博客 540

Qt5.14.2+VS2017开发环境搭建全流程(含插件配置与项目测试)

本文详细介绍了Qt5.14.2与VS2017开发环境的完整搭建流程,包括软件安装、插件配置、环境变量设置以及项目测试。特别针对实际开发中常见的配置问题提供解决方案,帮助C++开发者快速搭建高效的Qt开发环境。

weixin_28419039的博客 217

数据结构之二叉排序树(C++实现)

二叉树是数据结构中的一个非常非常重要的板块,俗话说不到长城非好汉,那么不会二叉树就不算了解数据结构。什么是二叉树,在之前我们了解了链表,但是我们在使用的时候就会发现一个问题就是,链表的每一个节点只能在同一方向指向一个节点,也就是不能分叉,可是在实际应用中必须要有分叉的存在,怎么办呢,前辈们就提出了二叉排序树的概念。通过前边的学习我们了解了单链表有两个区域,就是数据域和指针域,双向链表为了实现反向遍历多加了一个区域叫前驱指针域,所以双向链表就有了三个域,前驱指针域,后继指针域和数据域,同理我们就能猜出来,二叉

cheng_jack_li的博客 3595

昆仑通态屏幕制作(连载1)---接触篇

写在开始 背景:最近出了做QT、LORA和4G,还做了一个屏幕。以前做了一个迪文的串口屏幕,发现网上的教程很多,所以连载就不更新了,并且迪文屏幕的设置什么的比较简单,应该从网上都能找到对应的教程。而现在用的昆仑通态的屏幕属于嵌入式屏幕,至于为啥叫嵌入式,也不是很明白,反正就是需要用这个屏幕,嵌入式不嵌入式不重要了。重要的是能用,并且能实现串口屏幕不能实现的功能。所以选定昆仑通态的一款屏幕。 文章语言:我比较习惯用比较糙的语言介绍做的东西,有时候不太准备,但是为了方便理解,还请大家谅解。用...

weixin_45426095的博客 6734

C++实现树 - 03 二叉排序树

写在前面: 上一讲我们介绍了二叉树的代码实现以及其遍历方法,这一讲我们来看一看进阶版的二叉树 —— 二叉排序树。 性质 二叉排序树它和普通的二叉树不同: (1)如果根结点的左子树不为空,那么它左子树的所有结点的值都小于根结点。 (2)如果根结点的右子树不为空,那么它右子树的所有结点的值都大于根结点。 (3)根结点的左子树和右子树同样遵循上面两条性质。 根据性质我们可以知道,这颗排序二叉树的实现必然逃不了递归了,接下来我们来看看排序二叉树的代码是如何实现的。 二叉排序树的构建及插入 假设我们要构建起下面这.

Newin2020的博客 3159

ArcGIS:根据DEM数据提取区域水系

利用DEM数据提取区域水系是常见的水文分析应用,为了获取区域的矢量水系数据,我们可以通过ArcGIS对高程DEM数据进行水文分析,为地表水流建立模型,进而获取到该地的水系数据,DEM数据精度越高,获取到的水系数据精度也就越高。以下介绍如何用ArcGIS提供的工具提取水系。

Oruizn的博客 9107

CMake入门教程【基础篇】在Windows、Linux上安装CMake

CMake如何下载与安装

小鱼酱的博客 2725

二叉排序树的C++实现

二叉排序树的C++简单实现

qwas12345qwas的博客 596

fanuc机器人KAREL程序间参数的传递

之前的课程中讲述过KAREL程序中函数参数的传递,而控制工业机器人的动作只能通过控制TP程序来实现,所以在实际应用中就会出现在不同程序间进行参数的传递。尤其是对于有模块化编程的思想的设计者,更有这种迫切的要求。所以本次课程来讲解一下如何实现在不同程序之间进行参数的传递。 本次课程分为两个部分,以讲解在不同类型程序间进行参数传递的实现方式。 1、TP程序之间传递参数; 2、TP与PC程序之间传递参数。

haier123888的博客 2695

C++实现二叉排序树

二叉排序树 #include<iostream> using namespace std; class btreenode//二叉树的结点类 { public: int data; btreenode *left,*right; }; 二叉树类: 成员变量: root   二叉树的根节点           &nb...

weixin_44589374的博客 384

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

深度学习工具包 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")

用c++ 实现的二叉排序树(含源代码)

/*以下是用c++ 实现的二叉排序树的源代码*/#includetypedef struct TreeNode { int key; struct TreeNode *left; struct TreeNode *right; }treeNode;class BiSortTree{public:    BiSortTree(void); void desplayTree(void);//显

lzq_student的专栏 3089

WINCC7.3破解文件

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

C++简单二叉排序树实现

二叉排序树 1、使用随机数构建二叉排序树,若树空则新建节点,若大于节点就递归插入右子树,若小于节点则递归构建左子树。 2、中序遍历即可升序输出,调整左子树与右子树遍历顺序即可降序输出。 3、查找:若与节点匹配成功,则返回节点指针,若小于节点则递归查找左子树,若大于则递归查找右子树。 代码实现: #include <iostream> using namespace std; typed...

filan的博客 433

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

二叉排序树 ← C++实现

本算法代码改编自严蔚敏编著的《数据结构(C语言版|第2版)》的随书代码。主要是利用了自己熟悉的C++语法进行改编,希望对大家学习二叉排序树的实现有所帮助。

hnjzsyjyj的专栏 285

BST二叉排序树C++实现

BST二叉排序/查找/搜索树C++实现 实现代码 /* author : eclipse email : eclipsecs@qq.com time : Thu May 07 10:28:33 2020 */ #include<bits/stdc++.h> using namespace std; struct Node { int data; Node *le...

qq_44486439的博客 553

c++实现一个二叉排序树以及树的递归遍历的实现

二叉排序树的理论介绍: https://baike.baidu.com/item/%E4%BA%8C%E5%8F%89%E6%8E%92%E5%BA%8F%E6%A0%91/10905079?fr=aladdin 一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3...

仗劍走天涯 580

【C++】二叉排序树相关操作的实现

【C++】二叉排序树 (写在前面:这是数据结构课程作业,仅供学习参考) (1)二叉排序树的定义 二叉排序树或是空树,或是具有下述性质的二叉树:其左子树上所有结点的数据均小于根结点的数据值;右子树上所有结点的数据值均大于或等于根结点的数据值。左子树和右子树又各是一棵二叉排序树。 在二叉排序树中,若按中序遍历就可以得到由小到大的有序序列,如图2.41中的二叉排序树,中序遍历可得到有序序列{2,3,4,8,9,9,10,13,15,18,21}。 (2)二叉排序树的生成 二叉排序树是一种动态表结构,即二

qq_45870566的博客 941

数据结构与算法--二叉排序树(C++实现)

二叉树也是常用的数据结构。一棵二叉树由根节点(可以为空)和左右子树(也是二叉树)构成。通常情况下,二叉树的效率比线性链表高,因为二叉树上的查询、插入等操作即相当于二分法操作。本文用C++实现二叉树的算法,是C++、数据结构及算法学习的一个小练习。供大家参考。

DeeperBlue的博客 1万+

《大话数据结构》C++实现二叉排序树的查找、插入和删除操作

#include<iostream> using namespace std; typedef int status; //定义一个树的结构体 typedef struct BiTNode { int data; struct BiTNode* lchild, * rchild; }BiTNode, * BiTree; //函数声明 void CreateBST(BiTr...

人强小的博客 2315
上一篇: 线性表查找
下一篇: 并查集C++实现
-Gentle-
博客等级 码龄8年 80粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值