原本是想学习红黑树的,但是红黑树的基础是二叉排序树,所以先温习下二叉排序树。

重点在于:二叉排序树的删除和增加。在这里没有什么难点,因此省略

#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是否为空。

posted on 2012-09-14 16:56  不懂自然语言  阅读(209)  评论(0)    收藏  举报