1,头文件
#pragma once
#include <string.h>
template<class T>
class MyTree{
//内部类 节点类型
struct treeNode{
int count; //标记当前节点是 2节点 3节点 还是4节点
T data[3]; //保存数据
treeNode* pArray[4]; //保存指针
treeNode(){//构造函数
count = 0;
memset(data, 0, sizeof(T)* 3);
memset(pArray, 0, 16);
}
};
treeNode* pRoot; //指向根节点的指针
public:
MyTree() { pRoot = NULL; }
~MyTree() {
if (pRoot){
clear();
pRoot = NULL;
}
}
void clear();
void insert(const T& data);
private:
void _clear(treeNode* node);
void _insertNode(treeNode* node, treeNode* pParent, const T& data);
};
template<class T>
void MyTree<T>::clear(){
_clear(pRoot);
}
template<class T>
void MyTree<T>::insert(const T& data){
if (pRoot){
_insertNode(pRoot, NULL, data);
}
else{//如果pRoot为NULL
pRoot = new treeNode;
pRoot->count = 1;
pRoot->data[0] = data;
}
}
template<class T>
void MyTree<T>::_clear(treeNode* node){
}
template<class T>
void MyTree<T>::_insertNode(treeNode* node, treeNode* pParent, const T& data){
if (0 == node->count){
node->data[0] = data;
node->count++;
return;
}
else if (1 == node->count){//给2节点做插入
if (data < node->data[0]){//往左边加
if (node->pArray[0]){//有孩子
_insertNode(node->pArray[0], node, data);
}
else{//没有孩子
node->data[1] = node->data[0];
node->data[0] = data;
node->count++;
}
}
else{//往右边加
if (node->pArray[1]){//有孩子
_insertNode(node->pArray[1], node, data);
}
else{//没有孩子
node->data[1] = data;
node->count++;
}
}
}
else{//给3节点做插入
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){//当前操作产生了四节点
//1 创建两个新节点
treeNode* node1 = new treeNode;
treeNode* node2 = new treeNode;
//给新节点赋值
node1->data[0] = node->data[0];
node1->count = 1;
node1->pArray[0] = node->pArray[0];
node1->pArray[1] = node->pArray[1];
node2->data[0] = node->data[2];
node2->count = 1;
node2->pArray[0] = node->pArray[2];
node2->pArray[1] = node->pArray[3];
//2 临时存储当前节点中间的值
T temp = node->data[1];
//3 操作当前节点
if (pParent){//当前节点有父节点
//找位置
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 > 1 ) &&
(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{//当前节点没有父节点
memset(node->data, 0, sizeof(T)* 3);//清空数据
node->count = 1;
node->data[0] = temp;
memset(node->pArray, 0, 16);
node->pArray[0] = node1;
node->pArray[1] = node2;
}
}
}
2,源文件
#include <stdio.h>
#include "MyTwoThreeTree.h"
int main(){
int a[] = { 959, 366, 87, 233, 45, 17, 68, 39, 1, 56, 124, 10, 24, 40, 96 };
int len = sizeof(a) / sizeof(a[0]);
MyTree<int> tree;
for (int i = 0; i < len; i++)
tree.insert(a[i]);
while (1);
return 0;
}