数据结构学习第二十二课(23树)

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;
}

猜你喜欢

转载自blog.csdn.net/kdnnnd/article/details/120244852