首页 > 其他分享 >23树

23树

时间:2023-05-13 13:13:52浏览次数:14  
标签:node count 23 pArray pParent data 节点

#pragma once
#include <string.h>
//23树
template<class T>
class myTTT{
    struct Node{
        int        count;        //标记当前节点类型   2 3 4
        T        data[3];    //2节点只用[0]  3节点用 [0]和[1] 4节点都用
        Node*    pArray[4];    //2节点只用[0] 和[1] 3节点用 [0]和[1],[2] 4节点都用
        Node(){
            count = 0;
            memset(data, 0, sizeof(T)* 3);
            memset(pArray, 0, sizeof(Node*)* 4);
        }
    };
    Node*        pRoot;//指向根节点的指针
public:
    myTTT(){ pRoot = NULL; }
    ~myTTT(){}//析构函数先不写

    //插入一个节点到树中
    void insertNode(const T& data);

private:
    //新节点数据data,当前节点node,当前节点父节点pParent
    void _insertNode(Node* node, Node* pParent, const T& data);
};
template<class T>
//插入一个节点到树中
void myTTT<T>::insertNode(const T& data){
    if (pRoot){//pRoot不为NULL
        _insertNode(pRoot, NULL, data);
    }
    else{//pRoot为NULL
        pRoot = new Node;
        pRoot->count = 1;
        pRoot->data[0] = data;
    }
}

template<class T>
//新节点数据data,当前节点node,当前节点父节点pParent
void myTTT<T>::_insertNode(Node* node, Node* pParent, const T& data){
    if (NULL == node) return;//防呆
    if (0 == node->count){//当前节点是新建的    0节点
        pRoot->count++;
        pRoot->data[0] = data;
        return;
    }
    if (1 == node->count){//12节点变成3节点
        if (data > node->data[0]){//往右边添加
            if (node->pArray[0]){//有孩子
                _insertNode(node->pArray[1], node, data);
            }
            else{//没有孩子
                node->data[1] = data;
                node->count++;
            }
        }
        else{//往左边添加
            if (node->pArray[0]){//有孩子
                _insertNode(node->pArray[0], node, data);
            }
            else{//没有孩子
                node->data[1] = node->data[0];//往右边移
                node->data[0] = data;
                node->count++;
            }
        }
    }
    else{//3节点变成4节点
        if (data < node->data[0]){//往最左边添加
            if (node->pArray[0]){//有孩子
                _insertNode(node->pArray[0], node, data);
            }
            else{//没有孩子
                node->data[2] = node->data[1];//往右边移
                node->data[1] = node->data[0];//往右边移
                node->data[0] = data;
                node->count++;
            }
        }
        else if (data < node->data[1]){//往中间添加
            if (node->pArray[1]){//有孩子
                _insertNode(node->pArray[1], node, data);
            }
            else{//没有孩子
                node->data[2] = node->data[1];//往右边移
                node->data[1] = data;
                node->count++;
            }
        }
        else{//往右边添加
            if (node->pArray[2]){//有孩子
                _insertNode(node->pArray[2], node, data);
            }
            else{//没有孩子
                node->data[2] = data;
                node->count++;
            }
        }
    }


    if (3 == node->count){//4节点拆分
        //1 先拆成 3个 2节点
        //1.1 创建两个新节点
        Node* node1 = new Node;
        Node* node2 = new Node;

        //1.2 node1是node左边那个
        node1->data[0] = node->data[0];
        node1->count = 1;
        node1->pArray[0] = node->pArray[0];
        node1->pArray[1] = node->pArray[1];
        //1.3 node2是node右边那个
        node2->data[0] = node->data[2];
        node2->count = 1;
        node2->pArray[0] = node->pArray[2];
        node2->pArray[1] = node->pArray[3];

        //2 3个2节点中的父节点对当前节点的父节点作插入
        
        T temp = node->data[1];//2.1 临时存储中间那个(3个2节点中的父节点)

        //2.2 判断有无父节点
        if (pParent){//2.2.1 有父节点
            //2.2.1.1 找位置
            if (temp < pParent->data[0]){//最左边
                if (pParent->pArray[2]){//最右边有孩子
                    //数据
                    pParent->data[2] = pParent->data[1];
                    pParent->data[1] = pParent->data[0];
                    pParent->data[0] = temp;
                    //指针
                    pParent->pArray[3] = pParent->pArray[2];
                    pParent->pArray[2] = pParent->pArray[1];
                    pParent->pArray[1] = node2;
                    pParent->pArray[0] = node1;
                }
                else if (pParent->pArray[1]){//中间有孩子
                    //数据
                    pParent->data[1] = pParent->data[0];
                    pParent->data[0] = temp;
                    //指针
                    pParent->pArray[2] = pParent->pArray[1];
                    pParent->pArray[1] = node2;
                    pParent->pArray[0] = node1;
                }
            }
            else if (pParent->count == 1 ||
                (pParent->count == 2) &&  (temp < pParent->data[1])){//中间
                if (pParent->pArray[2]){//最右边有孩子
                    //数据
                    pParent->data[2] = pParent->data[1];
                    pParent->data[1] = temp;
                    //指针
                    pParent->pArray[3] = pParent->pArray[2];
                    pParent->pArray[2] = node2;
                    pParent->pArray[1] = node1;
                }
                else if (pParent->pArray[1]){//中间有孩子
                    //数据
                    pParent->data[1] = temp;
                    //指针
                    pParent->pArray[2] = node2;
                    pParent->pArray[1] = node1;
                }
            }
            else if (pParent->count == 2 ||
                (pParent->count > 2) && (temp < pParent->data[2])){//右边
                if (pParent->pArray[2]){
                    //数据
                    pParent->data[2] = temp;
                    //指针
                    pParent->pArray[3] = node2;
                    pParent->pArray[2] = node1;
                }
            }

            pParent->count++;
            delete node;//释放当前节点,因为已经插入到父节点中了
        }
        else{//2.2.2 没有父节点
            //2.2.2.1 当前节点数据改变
            memset(node->data, 0, sizeof(T) * 3);//清空
            node->data[0] = temp;
            node->count = 1;
            //2.2.2.2 两个孩子指针指向两个新节点
            memset(node->pArray, 0, sizeof(Node*) * 4);//清空
            node->pArray[0] = node1;
            node->pArray[1] = node2;
        }
    }


}

 

标签:node,count,23,pArray,pParent,data,节点
From: https://www.cnblogs.com/yewu1/p/17397162.html

相关文章

  • 欧姆龙CP1H与三菱变频器通讯 CIF01(232串口方式)可直接拿来实用了,欧姆龙CP1H 与变频器
    欧姆龙CP1H与三菱变频器通讯CIF01(232串口方式)可直接拿来实用了,欧姆龙CP1H与变频器modbus通讯案例采用的器件:欧姆龙CP1HPLC,2个CP1WCIF01(232串口单元),RS232转RS485转换器,三菱FR-E740变频器进行modbusRTU模式通讯。接线方式:PLC的两个串口单元CIF01,一个接MCGS触摸屏,一个接RS23......
  • 2023年5月12日记录
    冒泡排序 #include<iostream>usingnamespacestd;#defineN10intmain(){ inta[N]; inti,j,y,count=0,t; cout<<"请为数组元素赋初值"<<endl; for(i=0;i<=N;i++){ cin>>a[i]; } for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++) if(a[j......
  • 2023.5.12——软件工程日报
    所花时间(包括上课):6h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习。我了解到的知识点:1.了解了一些数据库的知识;2.了解了一些python的知识;3.了解了一些英语知识;5.了解了一些Javaweb的知识;4.了解了一些数学建模的知识;6.了解了一些计算机网络的知识;......
  • day71(2023.5.12)
    1.JavaEE简介 2.服务器 3.Tomcat的使用 4.Tomcat下载与安装 5.Tomcat目录结构与介绍 6.Tomcat启动与关闭输入后,小猫出来啦! 7.Tomcat配置文件介绍 8.解决控制台乱码以及修改Tomcat监听端口 9.配置TomcatManage......
  • 2023/5/12每日随笔
        今天,上午上了计算机网络,对于应用层进行了学习,介绍了域名系统,就是人为的标识对于ip地址的转化,紧接着就介绍了域名系统,对于域名系统进行查询的方法,后进行了概论论的学习,学了数理统计的几个分布,x2,t,f分布,下午在web上将对与学生管理系统的作业进行了书写,晚上出去了一趟,去了......
  • 题解 ABC239F【Construct Highway】
    翻译:给定\(n,m\)和度数数组\(\{d_i\}\),再给你\(m\)条边,请构造一棵\(n\)点的树包含这\(m\)条边,且第\(i\)个点的度数为\(d_i\),或者判断无解。显然,若\(\sumd_i\ne2(n-1)\),则无解。然后对于输入的每条边,使用并查集维护,再求出在这\(m\)条边的基础上每个点还需要多......
  • 编程一小时2023.5.11
    1.#include<iostream>#include<cstring>#include<algorithm>#include<set>usingnamespacestd;constintN=1010;intt,n;inta[N],b[N];set<int>st;intg[N][N];intmain(){scanf("%d",&t);while(t--......
  • 编程一小时2023.5.12
    #include<iostream>#include<cstring>#include<algorithm>#include<vector>#include<unordered_set>#pragmaGCCoptimize(2)#pragmaGCCoptimize(3)#definelfirst#definersecondusingnamespacestd;typedefpair<int,int>......
  • 2023-05-12:存在一个由 n 个节点组成的无向连通图,图中的节点按从 0 到 n - 1 编号, 给你
    2023-05-12:存在一个由n个节点组成的无向连通图,图中的节点按从0到n-1编号,给你一个数组graph表示这个图,其中,graph[i]是一个列表,由所有与节点i直接相连的节点组成。返回能够访问所有节点的最短路径的长度。你可以在任一节点开始和停止,也可以多次重访节点,并且可以重......
  • 2023市北区程序设计竞赛题解
    1.分糖果原题: 解题思路:这道题类似于辗转相除法,这道题是辗转相减,每次取余数,如果整除,直接计算答案,并退出,否则继续取余 AC代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;intmain(){ lla,b,ans=0;cin>>a>>b; while(a!=b){ if(a<b)swap(a,b......