您的位置:首页 > 编程语言 > C语言/C++

算法导论--二叉查找树--C++实现

2014-10-03 21:30 639 查看
头文件:

#ifndef BSTREE_H
#define BSTREE_H
typedef struct Node{
int key;
Node *p;
Node *left;
Node *right;
}Node;
class BSTree{
public:
Node *root;
BSTree():root(0){}
Node *minimum(Node *p);
Node *maximum(Node *p);
Node *predecessor(Node *p);
Node *successor(Node *p);
Node *search(int k);
void inorder(Node *p);
void insert(int k);
void remove(Node *p);
};
#endif源文件:
#include <iostream>
#include "bstree.h"

Node *BSTree::maximum(Node *p){
if(p==NULL)return p;
while(p->right){
p=p->right;
}
return p;
}
Node *BSTree::minimum(Node *p){
if(p==NULL)return p;
while(p->left){
p=p->left;
}
return p;
}
Node *BSTree::successor(Node *x){
if(x==NULL)return x;
if(x->right)
return minimum(x->right);
Node *y=x->p;
while(y!=NULL&&x==y->right){
x=y;
y=y->p;
}
return y;
}
Node *BSTree::predecessor(Node *x){
if(x==NULL)return x;
if(x->left)
return maximum(x->left);
Node *y=x->p;
while(y!=NULL&&x==y->left){
x=y;
y=y->p;
}
return y;
}
void BSTree::insert(int k){
//
Node *node=new Node;
node->left=NULL;
node->right=NULL;
node->key=k;
//
Node *y=NULL;
Node *x=root;
while(x){
y=x;
if(k<x->key)
x=x->left;
else
x=x->right;
}
node->p=y;
if(y==NULL)
root=node;
else if(k<y->key){
y->left=node;
}else
y->right=node;
}
void BSTree::remove(Node *z){
if(z==NULL)return;
Node *y,*x;
//
if(z->left==NULL||z->right==NULL){
y=z;
}else{
y=successor(z);
}
//
if(y->left)
x=y->left;
else
x=y->right;

//
if(x){
x->p=y->p;
}
if(y->p==NULL)
root=x;
else if(y==y->p->left)
y->p->left=x;
else
y->p->right=x;
//
if(y!=z)
z->key=y->key;
delete y;
}

Node *BSTree::search(int k){
if(root==NULL)return root;
Node *p=root;
while(p&&p->key!=k){
if(k<p->key)
p=p->left;
else
p=p->right;
}
return p;
}

void BSTree::inorder(Node *p){
if(p==NULL)return;
inorder(p->left);
std::cout<<p->key<<" ";
inorder(p->right);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: