二叉查找树的算法实现

二叉查找树主要包含以下算法:search,insert,delete,max,min,successor和predecessor。下面的程序是在vc6.0下实现的。其中,关于insert和search提高了迭代和递归两个版本,display使用了递归版本,其余算法都只提供了迭代版本。

#include <iostream>

using namespace std;

template<typename type>
class BinarySortTree;

template<typename type>
class Node{
public:
Node(type d):data(d), left(0), right(0), parent(0){}
friend BinarySortTree<type>;
private:
type data;
Node *left;
Node *right;
Node *parent;
};


template<typename type>
class BinarySortTree{
public:
BinarySortTree():root(0){}

Node<type> *searchIteration(type data){
   if (root == NULL)
    return NULL;

   Node<type> *p = root;
   while (p)
   {
    if (p->data == data)
     return p;
    else if (p->data > data)
     p = p->left;
    else
     p = p->right;
   }

   return NULL;
}

Node<type> *searchRecursion(int data){
   return searchRecursion(root, data);
}

Node<type> *predecessor(Node<type> *p){
   Node<type> *q;
   if (p->left)
   {
    q = p->left;
    while (q->right)
     q = q->right;
   }else{
    q = p;
    while (q == q->parent->left)
     q = q->parent;
   }

   return q;
}

Node<type> *successor(Node<type> *p){
   Node<type> *q;
   if (p->right)
   {
    q = p->right;
    while (q->left)
     q = q->left;
   }else{
    q = p;
    while (q == q->parent->right)
     q = q->parent;
   }
   return q;
}

Node<type> *min(){
   Node<type> *minPtr = root;
   if (root)
   {
    while (minPtr->left)
     minPtr = minPtr->left;
    return minPtr;
   }
   return NULL;
}

Node<type> *max(){
   Node<type> *maxPtr;
   if (root)
   {
    while (maxPtr->right)
     maxPtr = maxPtr->right;
    return maxPtr;
   }

   return NULL;
}

void insertIteration(type data){
   Node<type> *p = root;
   Node<type> *parent = NULL;
  
   while (p)
   {
    parent = p;
    if (p->data > data)
     p = p->left;
    else
     p = p->right;
   }

   Node<type> *newNode = new Node<type>(data);
   if (parent == NULL)
    root = newNode;
   else
   {
    newNode->parent = parent;
    if (parent->data > data)
     parent->left = newNode;
    else
     parent->right = newNode;
   }
}

void insertRecursion(type data){
   Node<type> *newNode = new Node<type>(data);
   insertRecursion(NULL, root, newNode);
}

Node<type> *del(type data){
   Node<type> *z = searchIteration(data);

   if (z == NULL)
    return NULL;

   Node<type> *y;
   if (z->left == NULL || z->right == NULL)
    y = z;
   else
    y = successor(z);
  
   Node<type> *x;
   if (y->left)
    x = y->left;
   else
    x = y->right;

   if (x)
    x->parent = y->parent;

   if (y->parent == NULL)
    root = x;
   else{
    if (y == y->parent->left)
     y->parent->left = x;
    else
     y->parent->right = x;
   }
   if (y != z)
    z->data = y->data;

   return y;
}

void display(){
   displayOneNode(root, 3);
}
private:
void displayOneNode(Node<type> *root, int layer){
   if (root == NULL)
    return;
  
   displayOneNode(root->left, layer + 5);
   for (int i = 0; i < layer; i ++)
    cout << " ";
   cout << root->data << endl;
   displayOneNode(root->right, layer + 5);
}

Node<type> *searchRecursion(Node<type> *root, type data){
   if (root == NULL)
    return NULL;
  
   if (root->data == data)
    return root;
  
   if (root->data > data)
    return searchRecursion(root->left, data);
   else
    return searchRecursion(root->right, data);
}

void insertRecursion(Node<type> *parent, Node<type> *cur, Node<type> *newNode){
   if (cur == NULL)
   {
    if (parent == NULL)
     root = newNode;
    else{
     newNode->parent = parent;
     if (parent->data > newNode->data)
      parent->left = newNode;
     else
      parent->right = newNode;
    }
    return;
   }
  
   if (cur->data > newNode->data)
    insertRecursion(cur, cur->left, newNode);
   else
    insertRecursion(cur, cur->right, newNode);
}

private:
Node<type> *root;
};

void main(){
BinarySortTree<int> binaryTree;
int arr[] = {15, 5, 16, 3, 12, 20, 10, 13, 18, 23, 6, 7};
for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i ++)
   binaryTree.insertIteration(arr[i]);

cout << "**************" << endl;
binaryTree.display();

int delData[] = {13, 16, 5};
for (i = 0; i < sizeof(delData)/sizeof(delData[0]); i ++)
{
   Node<int> *node = binaryTree.del(delData[i]);
   if (node)
   {
    cout << "delete " << delData[i] << " success" << endl;
    cout << "******after delete********" << endl;
    binaryTree.display();
    binaryTree.insertIteration(delData[i]);
    cout << "**************" << endl;
    binaryTree.display();
   }
}

//test recursion algorithm
BinarySortTree<int> binaryTree2;
cout << "test insertRecursion" << endl;
for (i = 0; i < sizeof(arr)/sizeof(arr[0]); i ++)
   binaryTree2.insertRecursion(arr[i]);
binaryTree2.display();
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值