原本是想学习红黑树的,但是红黑树的基础是二叉排序树,所以先温习下二叉排序树。
重点在于:二叉排序树的删除和增加。在这里没有什么难点,因此省略
#include<iostream>
using namespace std;
template<class T>
struct Node{
T key;
Node<T> *parent;
Node<T> *left;
Node<T> *right;
};
template<class T>
class SearchTree{
private:
Node<T> *root;
public:
SearchTree(T key);
Node<T> *getRoot();
Node<T> *find(Node<T> *root,T key);
Node<T> *successor(Node<T> *root);
Node<T> *prodecessor(Node<T> *root);
Node<T> *min(Node<T> *root);
Node<T> *max(Node<T> *root);
bool insert(T value);
bool remove(T value);
void midTravel(Node<T> *root);
int getHight(Node<T> *root);
};
template<class T>
SearchTree<T>::SearchTree(T key){
this->root = new Node<T>();
this->root->key = key;
this->root->left = NULL;
this->root->right = NULL;
this->root->parent = NULL;
}
template<class T>
Node<T>* SearchTree<T>::getRoot(){
return this->root;
}
template<class T>
int SearchTree<T>::getHight(Node<T> *root){
if(root==NULL)
return 0;
else{
if(getHight(root->left)>getHight(root->right))
return getHight(root->left)+1;
else
eturn getHight(root->right)+1;
}
}
template<class T>
void SearchTree<T>::midTravel(Node<T> * root){
if(root!=NULL)
{
midTravel(root->left);
cout<<root->key<<endl;
midTravel(root->right);
}
}
template<class T>
bool SearchTree<T>::remove(T value){
Node<T> *node = find(this->root,value);
if(node == NULL)
return false;
if(node->left == NULL){
if(node == node->parent->left){
node->parent->left = node->right;
if(node->right!=NULL)
node->right->parent = node->parent;
}
else{
node->parent->right = node->right;
if(node->right!=NULL)
node->right->parent = node->parent;
}
}
else if(node->right == NULL){
if(node->parent->left == node){
node->parent->left = node->left;
node->left->parent = node->parent;
}
else{
node->parent->right = node->left;
node->left->parent = node->parent;
}
}
else{
Node<T> *left = node->left;
Node<T> *p = NULL;
while(left->right!=NULL){
p = left;
left = left->left;
}
if(p==NULL){
node->key = value;
node->left = left->left;
if(left->left!=NULL)
left->left->parent = node;
}
else{
node->key = value;
p->right = left->left;
if(left->left!=NULL)
left->left->parent = p;
}
}
return true;
}
template<class T>
bool SearchTree<T>::insert(T value){
if(find(this->root,value)!=NULL)
return false;
Node<T> *node = new Node<T>();
node->parent = NULL;
node->left = NULL;
node->right = NULL;
node->key = value;
if(this->root == NULL)
this->root = node;
else
{
Node<T> *test = this->root;
Node<T> *p = NULL;
while(test!=NULL){
if(test->key > value)
{
p = test;
test = test->left;
}
else{
p = test;
test = test->right;
}
}
node->parent = p;
if(p->key > value)
p->left = node;
else
p->right = node;
}
return true;
}
template<class T>
Node<T>* SearchTree<T>::min(Node<T> *root){
Node<T> *p = root;
if(root == NULL)
return NULL;
else{
while(p->left !=NULL)
p = p->left;
return p;
}
}
template<class T>
Node<T>* SearchTree<T>::max(Node<T> *root){
Node<T> *p = root;
if(root == NULL)
return NULL;
else{
while(p->right != NULL)
p = p->right;
return p;
}
}
template<class T>
Node<T>* SearchTree<T>::prodecessor(Node<T> *root){
if(root == NULL)
return NULL;
else{
if(root->left != NULL)
return max(root->left);
else{
Node<T> *parent = root->parent;
Node<T> *now = root;
while((parent != NULL)&&(now == parent->left)){
now = parent;
parent = parent->parent;
}
return parent;
}
}
}
template<class T>
Node<T>* SearchTree<T>::successor(Node<T> *root){
if(root == NULL)
return NULL;
else{
if(root->right != NULL)
return min(root->right);
else{
Node<T> *parent = root->parent;
Node<T> *now = root;
while((parent != NULL)&&(now == parent->right))
{
now = parent;
parent = parent->parent;
}
return parent;
}
}
}
template<class T>
Node<T>* SearchTree<T>::find(Node<T> *root,T key){
if(root == NULL)
return NULL;
else{
if(root->key == key)
return root;
else if(root->key < key)
return(find(root->right,key));
else
return (find(root->left,key));
}
}
int main(){
SearchTree<int> *test = new SearchTree<int>(6);
test->insert(5);
test->insert(7);
//test->insert(8);
//test->insert(9);
//test->insert(1);
//test->insert(2);
test->midTravel(test->getRoot());
cout<<"hight is: "<<test->getHight(test->getRoot())<<endl;
system("pause");
return 0;
}
后记:
在删除部分存在一些小bug,主要是NULL指针。例如node->parent->left = node。没有考虑node->parent是否为空。
浙公网安备 33010602011771号