数据结构-二叉搜索树

1.二叉搜索树的基本操作——自己准备校招用的——不喜勿喷哦

本人将,重复的节点,只保存了数量。但是输出的时候却没有输出所有的节点,想要输出所有的节点,自己加个for循环即可哦

#include <iostream>
#include <queue>
using namespace std;
struct jian{
    int key;
    int num;
    jian *lc;
    jian *rc;
};
queue<jian*> q;
queue<jian*> p;
/**
* 创建树
*/
jian *create(jian *root,int x){
    if(root==NULL){
        root=new jian;
        root->key=x;
        root->num=1;
        root->lc=NULL;
        root->rc=NULL;
    }else{
        if(root->key==x){
            root->num++;
        }else if(root->key<x){
            root->rc=create(root->rc,x);
        }else{
            root->lc=create(root->lc,x);
        }
    }
    return root;
}
/**
* 前序遍历
*/
void xianxu(jian *root)
{
    if(root!=NULL){
        cout<<root->key<<" ";
        xianxu(root->lc);
        xianxu(root->rc);
    }
}
/**
*   中序遍历
*/
void zhongxu(jian *root)
{
    if(root!=NULL){

        zhongxu(root->lc);
        cout<<root->key<<" ";
        zhongxu(root->rc);
    }
}
/**
*   后序遍历
*/
void houxu(jian *root)
{
    if(root!=NULL){

        houxu(root->lc);
        houxu(root->rc);
        cout<<root->key<<" ";
    }
}
/**
*   层次遍历,两个队列,一个是按照层次取值,找出左右子树,放入队列,删掉队列首,
*   一个是,存放取出的节点
*/
void cengcibianli(jian *root){
    if(q.empty()){
        q.push(root);
    }

    while(!q.empty()){
        jian *tree=q.front();
        if(tree->lc!=NULL){
            q.push(tree->lc);
        }
        if(tree->rc!=NULL){
            q.push(tree->rc);
        }
        p.push(tree);
        q.pop();
    }

}
/**
*   在二叉搜索树中,最大的值一定是在左子树中的
*   当节点的左子树为空的话,那么这个点就是最小值的节点,自己画个图看看
*/
jian *findMin(jian *root){
    if(root->lc==NULL)
    {
        cout<<root->key<<endl;
        return root;
    }
    if(root->lc!=NULL){
        findMin(root->lc);
    }
}
/**
*在二叉搜索树中,最大的值一定是在右子树中的,
*当结节的右子树为空的话,那么这个节点就是最大值的节点
*/
jian *findMax(jian *root){
    if(root->rc==NULL)
    {
        cout<<"所在的树的最大值是:"<<root->key<<endl;
        return root;
    }
    if(root->rc!=NULL){
        findMax(root->rc);
    }
}
/**
* 删除最小的那个值
*/
jian *removeMin(jian *root){
    if(root==NULL){
        return NULL;
    }
    if(root->lc==NULL){
            /**
            * 如果左子树是空的那么,返回右子树的地址,纵然是null也无所谓
            */
        jian* rightRc=root->rc;
        //delete root;
        return rightRc;//返回的地址,被上一个节点连接
    }
    root->lc=removeMin(root->lc);
    return root;
}
jian *removeMax(jian *root){
    if(root==NULL){
        return NULL;
    }
    //删除最大的,肯定是在右子树旁边找,删除某一个最大值,只要再把子树移到上边就行
    //树的结构不会发生变化
    //当key所在的节点没有右孩子的时候,那么就可以,将左孩子一上去,
    //递归函数的返回值是非常重要的
    //删除最小值同理
    if(root->rc==NULL){
        jian *leftLc=root->lc;
        //delete root;
        return leftLc;
    }
    root->rc=removeMax(root->rc);
    return root;
}
jian* removeKey(jian *root,int key)
{
    if(root==NULL){
        cout<<"不存在该节点"<<endl;
        return NULL;
    }
    /**
    * 先找出对应key的节点的地址
    */
    if(root->key>key){
        root->lc=removeKey(root->lc,key);
        return root;
    }else if(root->key<key){
        root->rc=removeKey(root->rc,key);
        return root;
    }else{ 
        //key==root->key
        /**
        * 找到节点对应的地址
        *  1.如果左子树为空的树,说明是个最小值,删除节点,将子树移上去结构不变
        */
        if(root->lc==NULL){
            jian *rightRc=root->rc;
            delete root;
            return rightRc;
        }
         /**
        * 找到节点对应的地址
        *  1.如果右子树为空的树,说明是个最大值,删除节点,将子树移上去结构不变
        */
        if(root->rc==NULL){
            jian *leftLc=root->lc;
            delete root;
            return leftLc;
        }
        //左右子树都不为空的时候,
        /**
        *   左右子树都不为空的时候
        *   1.以当前节点的右子树的节点值为根,寻找右子树的最小值,作为替换,key所对应的节点
        *   2.返回的地址的右子树连接key对应节点的右子树删除最小值的新树
        *   3.左子树不变
        *   4其实寻找替换节点还可以用左子树的对应的最大值
        */
        jian *tree=findMin(root->rc);//寻找右子树中最小的值,当节点
        tree->rc=removeMin(root->rc);//
        tree->lc=root->lc;
        return tree;
    }
}
int main()
{
    int i;
    //int a[5]={5,2,4,8,6};
    int a[7]={10,7,4,9,12,13,11};
    jian *root;
    root=NULL;
    for(i=0;i<7;i++){
        root=create(root,a[i]);
    }
    //xianxu
    cout<<"前序遍历"<<endl;
    xianxu(root);
     cout<<endl;
   cout<<"中序遍历,其实就是从小到大排序!"<<endl;
    zhongxu(root);
     cout<<endl;
    cout<<"后序遍历"<<endl;
    houxu(root);
    cout<<endl;

    cout<<"层次遍历"<<endl;
    cengcibianli(root);
    while(!p.empty()){
        jian *tree=p.front();
        cout<<p.front()->key<<" ";
        p.pop();
    }
    cout<<endl;
    cout<<"删除最小值"<<endl;
    /*
    * 最小值是左子树中,最左边的值
    */
    findMin(root);
    cout<<"删除最大值"<<endl;
    /**
    *最大值是右子树中最右边的值
    */
    findMax(root);
    cout<<"删除二叉搜索树中的某个节点"<<endl;

    cout<<"先查找某一个节点"<<endl;
    //jian* tree;
    //tree=searchValue(2);
    cout<<"zainane"<<endl;
    int searchKey=12;
    root=removeKey(root,searchKey);

    cengcibianli(root);
    while(!p.empty()){
        jian *tree=p.front();
        cout<<p.front()->key<<" ";
        p.pop();
    }

}















/*queue<jian*> q;
queue<jian*> p;
jian* create(jian *root,int x){
    if(root==NULL){
            //这里创建的二叉搜索树,重复元素,用个数代替
        root=new jian;
        root->key=x;
        root->lc=NULL;
        root->rc=NULL;
        root=new jian;
        root->key=x;
        root->num=1;
        root->lc=NULL;
        root->rc=NULL;
    }

    else
    {
         if(x>root->key)
        {
            root->rc=create(root->rc,x);
        }
        else
        {
            root->lc=create(root->lc,x);
        }
        if(x>root->key){
            root->rc=create(root->rc,x);
        }else if(x<root->key){
            root->lc=create(root->lc,x);
        }else{
            root->num++;
        }

    }
    return root;
}
void bianli(jian *root){
    if(q.empty()){
        q.push(root);
    }
    jian *tree=q.front();
    if(tree->lc!=NULL){
        q.push(tree->lc);
    }
    if(tree->rc!=NULL){
        q.push(tree->rc);
    }
    p.push(tree);
    q.pop();
}

int main()
{
    jian* root;
    int x,i;
    int a[5]={5,4,6,2,8};
    for(i=0;i<5;i++)
    {
        root=create(root,a[i]);
    }


    //bfs层次遍历一下
   // bianli(root);
    while(!p.empty()){
        jian *tree=p.front();
        cout<<p.front()->key<<" "<<endl;
        p.pop();
    }
}*/

单向双向V2G 环境下分布式电源与电动汽车充电站联合配置方法(Matlab代码实现)内容概要:本文介绍了在单向和双向V2G(Vehicle-to-Grid)环境下,分布式电源与电动汽车充电站的联合配置方法,并提供了基于Matlab的代码实现。研究涵盖电力系统优化、可再生能源接入、电动汽车充放电调度、储能配置及微电网经济调度等多个关键技术领域,重点探讨了在不同电价机制和需求响应策略下,如何通过智能优化算法实现充电站与分布式电源的协同规划与运行优化。文中还展示了多种应用场景,如有序充电调度、鲁棒优化模型、多目标优化算法(如NSGA-II、粒子群算法)在电力系统中的实际应用,体现了较强的工程实践价值和技术综合性。; 适合人群:具备电力系统、新能源、智能优化算法等相关背景的科研人员、研究生及从事能源系统规划与优化的工程技术人员;熟悉Matlab/Simulink仿真工具者更佳。; 使用场景及目标:①用于科研项目中关于电动汽车与分布式电源协同配置的模型构建与仿真验证;②支持毕业论文、期刊投稿中的案例分析与算法对比;③指导实际电力系统中充电站布局与能源调度的优化设计。; 阅读建议:建议结合文中提供的Matlab代码与具体案例进行同步实践,重点关注优化模型的数学建模过程与算法实现细节,同时可参考文末网盘资源获取完整代码与数据集以提升学习效率。
【电动车】【超级棒】基于蒙特卡洛模拟法的电动汽车充电负荷研究(Matlab代码实现)内容概要:本文围绕基于蒙特卡洛模拟法的电动汽车充电负荷研究展开,利用Matlab代码实现对不同类型电动汽车(如常规充电、快速充电、换电模式)在不同场景下的充电负荷进行建模与仿真。通过蒙特卡洛方法模拟大量电动汽车的充电行为,结合用户出行规律、充电时间、电量需求等随机因素,分析电动汽车规模化接入电网后对电力系统负荷的影响,并探讨分时电价策略对充电负荷的引导作用,进而优化电网运行。研究涵盖充电负荷的空间分布特性、时间分布特征及对电网峰谷差的影响,旨在为电力系统规划和电动汽车有序充电管理提供理论支持和技术工具。; 适合人群:具备一定电力系统、交通工程或新能源汽车背景的研究生、科研人员及从事智能电网、电动汽车相关领域的工程技术人员。; 使用场景及目标:①用于研究大规模电动汽车接入对配电网负荷曲线的影响;②支撑分时电价、需求响应等政策制定与优化;③为充电站规划、电网调度、储能配置等提供数据支持和仿真平台;④适用于学术研究、课题复现及工程项目前期分析。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注蒙特卡洛模拟的参数设置、充电行为的概率建模过程,并尝试调整输入变量以观察负荷变化趋势,加深对电动汽车充电负荷不确定性和聚合效应的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值