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

用c++实现二叉树增删改查和快速排序算法

    博客分类:
  • C++
阅读更多
//快速排序
#include <iostream>
using namespace std;
#define N 10240
template< typename T >
void sort( T* a, int n ){
        if(n<=0) return;
        if(n==2) {
                if(a[1] < *a) swap(a[1],*a);
                return;
        }
        swap( *a,a[n>>1] );
        T v = *a;
        T* left = a+1;
        T* right = a+n-1;
        while( left<right ){
                while( left<right&&*left<v ) ++left;
                while( *right>v&&right>a ) --right;
                if( left<right ) swap(*left,*right );
        }
        swap( *a, *right );
        sort( a, right-a );
        sort( right+1, n-1-(right-a) );
}

int main()
{
        int a[N];
        for( int i=0; i<N; i++)
                a[i] = N-i;
        time_t t = time(NULL);
        sort(a,N);
        cout << "Time : " << time(NULL)-t << endl;
        for( int i=0; i<10; i++)
                cout << a[i] << ' ' ;
        cout << endl;
}




//二叉树
#include <iostream>
using namespace std;

template< typename T >
class BanaryTree{
private:
        struct Node{
                T data;
                Node* left;
                Node* right;
                Node():data(T()),left(NULL),right(NULL){ }
                Node(const T& t):data(t),left(NULL),right(NULL){ }
        }; // the end of struct

        Node* root;
public:
        BanaryTree():root(NULL){ }
        ~BanaryTree(){
                clear(root);
                cout << "~BanaryTree()" << endl;
        }
        void push(const T& t ){
                Node* p = new Node(t);
                insert(root, p );
        }
        bool empty(){
                return root==NULL;
        }
        void travel(){
                show(root);
                cout << endl;
        }
        int size(){
                return size(root);
        }
        bool find( const T& t ){
                Node* p = new Node(t);
                return find(root, p)!=NULL;
        }
        void erase( const T& t ){
                Node* p = new Node(t);
                Node*& q = find(root,p);
                if(!q) return;
                Node* r = q;
                insert( q->right, q->left );
                q = q->right;
                delete r;
        }
        void update(const T& o, const T& n){
                if( !find(o) ) return;
                erase(o);
                push(n);
        }
private:
        Node*& find( Node*& tree,Node*& p ){
                if(!tree) return tree;
                else if(!p) return p;
                else if( tree->data == p->data ) return tree;
                else if(p->data < tree->data )
                        return find( tree->left, p);
                else return find( tree->right, p);
        }
        int size( Node* tree ){
                if(!tree) return 0;
                return size(tree->left) + size(tree->right) + 1;
        }
        void show(const Node* tree){
                if(!tree) return;
                show(tree->left);
                cout << tree->data << ' ';
                show(tree->right);
        }
        void insert( Node*& tree,Node* p){
                if(!tree) tree = p;
                else if(p->data<tree->data) insert(tree->left,p);
                else insert(tree->right, p);
        }
        void clear(Node*& tree){
                if( empty() ) return;
                if( !tree ) return;
                clear( tree->left );
                clear( tree->right );
                delete tree;
                tree = NULL;
        }
}; //the end of class

int main()
{
        BanaryTree<int> bi;
        for(int i=0; i<10; i++)
                bi.push(10-i);
        bi.travel();
        cout << "size() : " << bi.size() << endl;
        cout << "find(5) : " << bi.find(5) << endl;
        cout << "find(100) : " << bi.find(100) << endl;
        bi.erase(6);
        bi.travel();
        bi.erase(50);
        bi.travel();
        bi.update(10,11);
        bi.travel();
        bi.update(10,11);
        bi.travel();
}

0
0
分享到:
评论

相关推荐

    常用的C和C++代码,常用排序,增删改查操作,链表基本操作

    本压缩包包含了一系列与C和C++编程相关的实践示例,涵盖了数据结构、算法和基本操作等核心知识点。 首先,我们看到"从下至上按层遍历二叉树.c",这是关于二叉树的一种遍历方法。二叉树是一种非线性数据结构,下至上...

    数据结构大作业(图书馆管理系统)

    6. **哈希表**:为了快速查找特定图书,可以构建哈希表,通过图书编号或关键词实现快速检索。 接下来,我们探讨**C++编程语言**。C++是一种强大的、面向对象的编程语言,适合开发这样的系统。在本项目中,C++的以下...

    C和C++与数据结构基础讲义

    - 文件系统:文件系统中的目录结构可以看作是一种树形数据结构,C和C++可以用于实现文件的增删改查操作。 - 数据库:数据库索引往往基于B树或B+树,C和C++能够实现这些高效的数据结构。 - 网络协议:TCP/IP协议栈...

    数据结构和算法的综合示例集合 - C++, Java - 下载.zip

    2. 分析代码实现,注意关键函数和方法,理解它们如何实现数据结构的增删改查或算法的逻辑流程。 3. 运行示例,观察输出,验证算法的正确性。 4. 对比不同数据结构和算法的效率,了解何时使用哪种更合适。 5. 尝试...

    数据结构二叉树操作实验代码

    本实验代码是针对山东大学数据结构课程设计的一份实践材料,旨在帮助学生掌握二叉树的基本操作,包括增、删、改、查等核心功能。 首先,我们要理解二叉树的基本概念。二叉树是由n(n&gt;=0)个有限结点组成一个具有...

    数据结构与算法C++版

    这些容器类可以用来存储不同类型的数据,并提供了丰富的接口来进行数据的增删改查。 2. **算法**:STL中定义了许多通用的算法函数,如sort、find、copy等,可以方便地应用于各种容器。 3. **迭代器**:迭代器是STL的...

    数据结构 答案 c++

    面向对象的方法则可能将数组封装在类中,提供增删改查等接口。 二、链表 链表由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在C++中,链表可以通过结构体或类来实现,每个节点是一个对象,包含数据域...

    Algorithms &amp; Data structures in C++..zip

    例如,vector是一种动态数组,可以方便地进行元素的增删改查,而map则提供了键值对的存储,支持高效的查找操作。 在实际编程中,结合使用算法和数据结构是解决问题的关键。例如,当我们需要处理大量数据时,可能会...

    数据结构c++北大版习题解答

    课后习题可能包括创建、初始化、遍历以及对数组元素的增删改查操作。 2. **链表**:链表是由节点构成的线性数据结构,每个节点包含数据和指向下一个节点的指针。单链表、双链表和循环链表是常见的链表类型。习题...

    C++数据结构课程设计的源代码里面有二十多个选题.rar

    1. **线性数据结构**:如数组和链表,可能会涉及到动态数组的增删改查操作,链表的遍历、插入和删除等。 2. **栈与队列**:它们是两种基础的抽象数据类型,具有后进先出(LIFO)和先进先出(FIFO)的特性。在实际...

    08-为何二叉树重要.md

    例如AVL树和红黑树都是BBST的实现,它们通过旋转和重新着色等操作,保持树的平衡,从而确保增删查改的时间复杂度始终维持在O(logn)级别。 红黑树是一种自动平衡的二叉搜索树,其节点着色规则复杂,但它的平衡操作...

    数据结构以及算法经典

    例如,可能会有二叉搜索树的增删改查操作,这有助于理解树的特性;也可能包含图的遍历算法,比如深度优先搜索和广度优先搜索,这对于理解网络拓扑和路径寻找很重要;更有可能包含动态规划的实例,如背包问题或最长...

    C语言多种算法的实现

    - **链表**:包括单链表、双链表和循环链表的增删改查操作。 - **栈**:后进先出(LIFO)的数据结构,实现括号匹配等。 - **队列**:先进先出(FIFO)的数据结构,如循环队列和优先级队列。 - **树**:如二叉...

    C++后端学习的技术栈

    - **SQL语言**:熟悉SQL语法,能够进行基本的数据增删改查操作。 - **ORM框架**:使用如SQLite、MySQL、PostgreSQL等数据库管理系统时,选择合适的ORM框架简化数据访问过程。 - **数据库连接池**:了解如何使用...

    C++面试题汇总.zip

    1. **数组、链表、栈、队列**:基础数据结构的理解和操作,如增删改查、遍历等。 2. **树与图**:二叉树、平衡树(AVL、红黑树)、图的遍历(深度优先搜索、广度优先搜索)等。 3. **排序与查找**:快速排序、归并...

    2015年欢聚时代校园招聘C++笔试题目.pdf

    - **排序算法**:可能会出现快速排序、归并排序、插入排序、冒泡排序等,考察效率和实现细节。 - **查找算法**:二分查找、哈希查找等,理解其时间复杂度和应用场景。 - **链表操作**:如反转链表、删除节点、...

    传智播客扫地僧视频讲义源码

    本教程共分为5个部分,第一部分是C语言提高部分,第二部分为C++基础部分,第三部分为C++进阶部分,第四部分为C、C++及数据结构基础部分,第五部分为C_C++与设计模式基础,内容非常详细. 第一部分 C语言提高部分目录...

    中兴2014校园招聘—软件笔试真题(影印版)

    5. **数据库**:SQL语言基础,如查询、增删改查操作,关系数据库模型,事务处理,索引原理,数据库设计的范式理论。 6. **软件工程**:软件开发生命周期(SDLC)的各个阶段,需求分析、设计、编码、测试和维护的...

    LeetCode:用 C++ 编写 Leetcode

    这些容器提供了便利的增删改查操作,以及迭代器进行遍历。 5. **字符串处理**:C++ 提供了 string 类型,可以方便地处理字符串。在 LeetCode 中,字符串问题是常见的题目类型,熟悉 string 类的 API 很重要。 6. *...

Global site tag (gtag.js) - Google Analytics