`
yunchow
  • 浏览: 317724 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

C++算法与二叉树的实现

    博客分类:
  • C++
阅读更多
* 输出格式控制
  + 成员函数:width fill pricision setf/unsetf
  + 格式控制符:endl/flush/setw/setf/sefpricision
  + 文件打开方式:ios::out/ios::in/ios::app/ios::binary(for windows)
  + open ofstream fout;fout.open(文件名);//不提倡这么写
  + is_open();//判断打开否?if(!fout.isopen())//if(!fout)一样.一般不用if

(!fout.isopen())这类形式.

* 异常
  + try{  throw 数据; } catch(类型 e){ /*code*/ }
catch(子类 e){ /*code*/ }catch(父型 e){ /*code*/ }
catch(...){ /*code*/ }
  + 如果有未处理异常,此异常会向调用方传递.

* 链表
  + struct Node{
T data;
Node* next;
    };//链表结点
  + Node* p = head;p = p->next;
  + 尾结点的标志是:p->next == NULL;
  + 创建空链表:head = NULL;
  + 释放,思路是从头到尾依次释放.
  + 增删改查.
- 头插法:p->next = head; head = p;
- 当查找时,找到了返回索引号,如未找到则返回-1
- 当删除时要返回删除结点的前一个结点.getPointer(pos-1)
pre->next = cur->next;
delete cur;//释放很重要,不要忘了此步
  + 附加操作: size(),empty(){ /*head是否为空*/ },getHead/*有无头?

getTail/*getPointer(size()-1))*/
======================================================
* 双向链表
struct Node{
	T data;
	Node* prev;
	Node* next;
};

赋值时要多给一个指针prev赋值
定义时不但要定义一个头指针还要定义一个尾指针.
------------------------------------------------------
* 栈,队列

栈(LIFO/FILO)又称线性表,只允许在同一端进行插入和删除.
组合也可以达到代码重用的目的.但是组合优于继承.
+ QUEUE
class Queue{
	List l;
public:
	void push(const T& t){ }	//数据入队
	void pop(){ } 			//删除队首元素
	T front(){ }			//取得队首元素
	T back(){ } 			//取得队尾元素
	bool empty(){ } 		//判断队列是否为空
	int size(){ } 			//返回队列元素个数
	void clear(){ }			//清空整个队列
};// The end of class Queue


//用数组来实现栈
#include <iostream>
using namespace std;
typedef int T;

class Stack{
        T a[10];
        int num;//已经放的元素个数
public:
        void push(const T& t){
                if(full())
                        throw "Exception:stack over";
                a[num++] = t;
        }
        void pop(){
                if(empty())
                        throw "Exception:stack empty";
                num --;
        }
        T top(){
                if(empty())
                        throw "Exception:stack empty";
                return a[num]-1;
        }
        bool empty(){
                return num==0;
        }
        bool full(){
                return num==10;
        }
        int size(){
                return num;
        }
        void clear(){
                num = 0;
        }
        int capacity(){
                return 10;
        }
        Stack():num(0){  }
};
int main()
{
        Stack s;
        for(int i=0;i<10;i++)
                s.push(i+1);
        while(!s.empty()){
                cout << s.top() << ' ';
                s.pop();
        }
        cout << endl;
        for(int i=0;i<10;i++)
                s.push(i);
        cout << "full?" << s.full() << endl;
        try{
                s.push(100);
        }
	//注意异常处理时,要严格的类型匹配
        catch(const char* e)/*捕获字符串类型异常*/{
                cout << e << endl;
        }
        catch(...){
                cout << "Unknow Exception" << endl;
        }
        cout << "Finish" << endl;
}

--------------------------------------------
* Binary Tree
处理树时一般会用到递归.
树的分支互不交叉,有统一的根
+ binary search tree(BST):二叉查找树或叫二叉排序树.
   - 左子树:A node's left child must have a key less than its paren.
   - 右子树:A node's right child must have a key greater than or equal

to its parent
//树的节点定义
struct Node{
	T data;
	Node* left;  //指向左子树的根节点
	Node* right; //指向右子树的根节点
	Node(const T& t):data(t),left(NULL),right(NULL){}
};// end of struct tree node


要管理二叉树需要:Node* root = NULL;
//对树的遍历
void travel(Node* tree){
	if(!tree) return;
	travel(tree->left);//先访问
	cout << tree->data << ' ';
	travel(tree->right);
}

遍历顺序:根左右:前序遍历,先根遍历
左根右:中序遍历,中根遍历(用的最多的遍历方式)
左右根:后序遍历,后根遍历
//清空
void clear(Node*& tree){
	if(!tree) return;
	clear(tree->left);
	clear(tree->right);
	delete tree;
	tree = NULL;
}
//把问题想简单点
//返回二叉树的节点数
int size(Node* tree){
	if(!tree) return 0;
	return size(tree->left)+size(tree->right)+1;
}


bool empty(Node* tree){}//EASY
+ 增加
void insert(Node*& tree,Node* p){
	if(tree==NULL) tree = p;
	else if(p==NULL) return;
	else if(p->data<tree->data)
		insert(tree->left,p);
	else	insert(tree->right,p);
}

+ 查找
Node*& find(Node*& tree, const T& t){
	if(tree==NULL) return tree/*tree为NULL*/;
	if(tree->data==t) return tree;//此时tree定不是NULL
	if(t<tree->data) return find(tree->left,t);
	else return find(tree->right,t);
}

+ 删除
1,合并左右分支
2,让指针指向合并后的分支
3,释放要删除的节点
void erase(Node*& tree,const T& t){
	Node*& p = find(tree,t);
	if(p==NULL) return;
	insert(p->right,p->left);
	Node* q = p;
	p = p->right;
	delete q;
}

+ 改
//注意不能直接更改数据
void update(const T& o, const T& n){
	Node *& p = find(tree,o);
	if(p==NULL) return;
	erase(root,o);
	p = new Node(n);
	insert(root,p);
}

==================================================
* 什么是算法?
算法是在有限步骤内求解某一问题所使用一组定义明确的规则.
通俗的说算法就是计算机解题的过程 .
算法有五个重要的特征:有穷性,确切性,输入,输出,可行性.
每个算法都有一个复杂度(/性)complexity,又分为时间复杂度和空间复杂度.
现在的空间基本上都不是问题,所以最主要还是时间上的问题.
时间是一个重要的标志.我们关心一个算法的效率主要是关心他的时间复杂度
* 算法分析
  - 确定与检验程序正确与否
  - 运行速度
  - 程序的复杂性
  - 程序的可靠性(健壮性)
- 野指针,垃圾数据,局部变量的引用或指针
- 使用已经delete 的空间,越界访问数组
- 没有错误检查.
  - 使用内存的大小
  - 代码的size

设计出复杂性尽可能低的算法.
--------------------------------------------------
* 程序的性能
hardware
The programming language used
The compiler used
The OS

* 运行效率
平均运行时间
最佳与最差的运行情况
大O表示法:表示算法的效率
O(最多多少次)
A linear search(线性查找): O(N)
A binary search(二分查找,折半查找): O(log(2)N)

* 算法设计策略
蛮力法(暴力法) ----- 穷举所有可能性.
递归技术 ----- 最常用的算法设计思想,体现于许多优秀算法中.(效率虽低,但低不

到哪去,所以尽管放心用)
分治法 ------ 分而制之的算法思想,体现了一分为二的哲学思想.
以上为常见的算法策略
-------------------------------------------------
不常见的:
模拟法 -------- 用计算机模拟实际场景
贪心算法 ------ 贪心正常,每个人都会有贪念
优化法 ------- 利用生物学优先原理.
=================================================
* 常用的重要排序方法.
+ 选择排序
最直接的排序方法,每次选择一个最大(最小)的元素放到应该的位置.

//排序
#include <iostream>
using namespace std;

typedef int T;
void sort(T a[], int n){ // 可写成T* a 
	for(int i=0;i<n-1;i++){
		int pos = i;
		for(int j=i+1;j<n;j++){
			if(a[j]<a[pos])
				pos = j;
		swap(a[pos],a[i]);
	}
}
int main()
{
	const int N=10240;
	int a[N];
	for(int i=0;i<N;i++)
		a[i] = N-i;
	for(int i=0;i<10;i++)
		cout << a[i] << ' ';
	cout << endl;
}



//二叉树完整例子
#include <iostream>
using namespace std;

typedef int T;
class BanaryTree {
        struct Node {
                T data;
                Node* left;
                Node* right;
                Node(const T& t):data(t),left(NULL),right(NULL){ }
        };//end of struct Node

        Node* root;
        int n;
public :
        BanaryTree():root(NULL),n(0){ }
        ~BanaryTree() {
                clear(root);
                cout << "~BanaryTree()" << endl;
        }
        int size() { return n; }

        void add(const T& t){
                Node* p = new Node(t);
                insert(root,p);
                n ++ ;
        }
        void show(const Node* tree){
                if(tree==NULL) return;
                show(tree->left);
                cout << tree->data << ' ';
                show(tree->right);
        }
        void travel(){
                show(root);
                cout << endl;
        }
        void clear(Node*& tree){
                if(!tree) return;
                clear(tree->left);
                clear(tree->right);
                delete tree;
                tree = NULL;
        }
        bool isHave(const T& t){
                if(find(root,t)) return true;
                else return false;
        }
        void erase(const T& t){
                Node*& p = find(root,t);
                if(!p) throw "Exception:no this element";
                Node* q = p;
                insert(p->right,p->left);
                p = p->right;
                delete q;
                q = NULL;
        }
        void update(const T& o, const T& n){
                erase(o);
                add(n);
        }
private:
        void insert(Node*& tree, Node* p){
                if(tree==NULL) tree = p;
                else if(!p) return;
                else if(p->data<tree->data) insert(tree->left,p);
                else insert(tree->right,p);
        }
        Node*& find(Node*& tree, const T& t){
                if(!tree) return tree;
                else if(tree->data==t) return tree;
                else if(t<tree->data) return find(tree->left,t);
                else return find(tree->right,t);
        }
};
int main()
{
        BanaryTree b;
        for( int i=1;i<10;i++)
                b.add(i);
        b.add(18);
        b.add(100);
        b.add(-5);
        cout << "size():" << b.size() << endl;
        b.travel();
        cout << "isHave(3):" << b.isHave(3) << endl;
        cout << "isHave(0):" << b.isHave(0) << endl;
        try{
                b.erase(8);
        }catch(const char* e) { cout << e << endl; }
        b.travel();
        b.update(-5,-199);
        b.travel();
}
1
0
分享到:
评论

相关推荐

    基于Springboot+Vue的墙绘产品展示交易平台毕业源码案例设计.zip

    网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

    99-青海大学大数据中心建设分享.pptx

    99-青海大学大数据中心建设分享.pptx

    TD-LTE载波聚合方案.docx

    5G通信行业、网络优化、通信工程建设资料。

    10份网络优化创新案例.zip

    SA语音回落与切换流程冲突解决.pdf 计费模式错误导致SA语音承载建立失败,pdf BSF网元bug导致SA用户VOLTE业务故障,pdf SA基站SCTP偶联IP配置不规范导致切换失败的问题处理,pdf 第一医院SA+NSA双模基站方案保障5G查房车应用,pdf SA未配置互操作场景下终端语音业务研究案例,pdf SA站点天馈隔离度问题导致上行速率不及预期,pdf SA组网下微信小视频卡顿影响感知案例,pdf 基于八步法定位SA掉线问题.pdf SA站点测试宏微切换异常事件,pdf

    施工监理费计算依据.doc

    5G通信行业、网络优化、通信工程建设资料。

    wordpress插件WhatsApp右下角浮动悬浮客服按钮

    1、WhatsApp插件,可轻松实现wordpress后台设置,前台悬浮显示; 2、无缝集成:该插件将WordPress站点与WhatsApp无缝集成; 3、多人员支持:支持显示多个WhatsApp账户,让用户根据需求或偏好选择联系不同的团队成员 4、群组邀请:允许邀请用户加入特定的WhatsApp支持群组,便于群体咨询、公告发布或集体答疑。 5、响应式设计:插件具备响应式布局,确保在各种屏幕尺寸和设备类型上均能良好呈现并顺畅使用。 6、WooCommerce产品查询集成:针对电商网站,支持与WooCommerce产品查询功能结合,方便用户就具体商品提问。 7、带声音的自动弹窗:可设置带有声音提示的自动弹出窗口,提醒用户支持服务的存在 8、定制欢迎消息:设置个性化欢迎信息,向用户传递品牌关怀或引导其使用支持服务。 9、移动端与桌面端开关控制:可根据需要独立开启或关闭移动端或桌面端上的插件功能 10、GDPR合规:遵循欧盟GDPR数据保护法规,保障用户隐私及数据安全。

    基于YOLOv7的芯片表面缺陷检测系统

    目前随着电子领域的快速发展,芯片也已经成为日常生活中不可或缺的一部分。随着市场对芯片的需求不断增大,裸芯片表面缺陷检测任务的压力也越来越大。裸芯片表面的缺陷检测不仅能保证芯片成品的质量,而且有着统计缺陷数量,反馈给生产前道工序的重要意义,但是目前许多生产线对于裸芯片表面依旧采用人工目检的方法进行缺陷检测,不仅实时性差,耗时长,而且结果会受到检测人员主观因素的影响。  目前国内外的芯片表面缺陷检测设备不仅价格昂贵,而且功能比较单一,因此本文提出了一种基于深度学习的裸芯片表面缺陷检测算法,具有高效率,实时性好的特点,与传统人工目检的方式相比具有一定的优势

    基于SpringBoot的“大学生社团活动平台”的设计与实现.zip

    基于SpringBoot的“大学生社团活动平台”的设计与实现基于SpringBoot的“大学生社团活动平台”的设计与实现基于SpringBoot的“大学生社团活动平台”的设计与实现基于SpringBoot的“大学生社团活动平台”的设计与实现基于SpringBoot的“大学生社团活动平台”的设计与实现基于SpringBoot的“大学生社团活动平台”的设计与实现基于SpringBoot的“大学生社团活动平台”的设计与实现基于SpringBoot的“大学生社团活动平台”的设计与实现基于SpringBoot的“大学生社团活动平台”的设计与实现

    英飞凌官方ADS库1.9.20版

    英飞凌官方ADS库1.9.20版

    汇编语言-assembly-贪吃蛇游戏-汇编语言期末大作业

    汇编语言——贪吃蛇游戏 GREEDY_SNAKE 是基于8086 汇编语言开发的,汇编语言风格是采用《汇编语言》第二版 王爽著; G_Snake.asm 本贪吃蛇游戏 实现了随机出现食物、统计分数、显示小蛇运动方向、响应键盘中断、指定方向自动移动、游戏结束恢复9h键盘中断和正常退出。 文件说明: 1. 安装DOSBOX:运行DOSBox0.74-win32-installer.exe即可安装; 2. 将Greedy_Snake clone到本地任意盘,eg:d:\Greedy_Snake - mount d:\Greedy_Snake 到一个指定虚拟盘符: - `mount k d:\Greedy_Snake` (why is k? because i like this charactor) 3. 运行G_Snake - 在DOSBOX的DOS提示符下键入: - `Z:\>K:`(回车) - `K:\>cd G_Snake`(回车) - 使用masm 5.0工具编译、链接、运行.asm源程序 - MASM.EXE、LINK.EXE、d

    物联网考试题库答案.doc

    5G通信行业、网络优化、通信工程建设资料

    基于Python的在线学习与推荐系统设计带vue前后端分离毕业源码案例设计.zip

    网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

    考试资料+7、互联网与物联网.docx

    5G通信行业、网络优化、通信工程建设资料

    参考资料-人工智能对劳动力市场的影响机制研究.pdf

    参考资料-人工智能对劳动力市场的影响机制研究.pdf

    99-数据开放平台技术实现方案.pptx

    99-数据开放平台技术实现方案.pptx

    199-IBM数据治理新主张-数据治理及元数据管理.pptx

    199-IBM数据治理新主张-数据治理及元数据管理.pptx

    关注于一个操作系统框架的设计与实现。所使用的工具有gcc、nasm、bochs、gdb、vim等.zip

    【资源说明】【毕业设计】 1、该资源内项目代码都是经过测试运行成功,功能正常的情况下才上传的,请放心下载使用。 2、适用人群:主要针对计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、数学、电子信息等)的同学或企业员工下载使用,具有较高的学习借鉴价值。 3、不仅适合小白学习实战练习,也可作为大作业、课程设计、毕设项目、初期项目立项演示等,欢迎下载,互相学习,共同进步!

    自动驾驶中的数据闭环建立(一).pdf

    自动驾驶中的数据闭环链路的建立,数据驱动算法

    通信工程监理工作流程表.doc

    5G通信、网络优化与通信建设

    推荐智慧政务大数据 政务综合服务平台建设项目方案书.doc

    社会治理大数据平台建设项目的总体目标是以项目建设为契机,以“一个网络体系、一套应用系统、三个基础库”为依托,充分利用大数据挖掘、云计算等先进技术,有效整合各方信息资源,实现“人、地、物、事、组织”的网格化管理,从而带动XXX社会管理源头治理体系、动态协调机制、应急管理体制建设,实现XXX社会管理“精确化”、社会服务“人性化”,提升社会服务效能,并为XXX实现智慧城市奠定信息化基础。 主要建设目标是为政府社会管理良性有序运行提供基本手段和保证,促进政府对社会系统的组成部分、社会生活的不同领域以及社会发展的各个环节进行组织、协调、服务、监督和控制,整合政府各部门资源,实现统一运维管理,并建立安全和运维保障体系。科学划分网格单元,优化网格资源配置,构筑“区—街道—社区—网格”的四级管理架构,以社会管理、基层服务为核心,实现管理服务工作的全员化、精细化、信息化、实效化。

Global site tag (gtag.js) - Google Analytics