只要再有一个可以排序的类就可以直接使用这个二叉排序树,完全可重用性MAX
#include<iostream>
using namespace std;
template<class T>
class Node {
public:
T val;
int ln, rn;
Node<T> *h;
Node<T> *l;
Node<T> *r;
Node<T>(T value,Node *head) {
this->val = value;
this->h = head;
this->l = nullptr;
this->r = nullptr;
}
};
template<class T>
class Tree {
public:
Node<T> *root, *temp;
Tree() {
root = nullptr;
temp = nullptr;
}
void add(T v) {
if (root == nullptr) {
root = new Node<T>(v, nullptr);
}
else {
temp = root;
while (true) {
if (temp->val > v) {
if (temp->l != nullptr) {
temp = temp->l;
}
else {
temp->l = new Node<T>(v, temp);
return;
}
}
else {
if (temp->r != nullptr) {
temp = temp->r;
}
else {
temp->r = new Node<T>(v, temp);
return;
}
}
}
}
}
void cut(T t) {
temp = root;
Node<T> *c;
if (temp->val == t) {
if (root->r!=nullptr) {
root = temp->r;
c = temp->r;
temp = temp->l;
while (c->l != nullptr) {
c = c->l;
}
c->l = temp;
}
else if (root->l != nullptr) {
root = temp->l;
}
else {
root = nullptr;
}
}
else {
while (true) {
if (temp->val > t) {
if (temp->l->val == t) {
c=temp->l->l;
temp->l = temp->l->r;
while (temp->l != nullptr) {
temp = temp->l;
}
temp->l = c;
return;
}
temp = temp->l;
}
else {
if (temp->r->val == t) {
c = temp->r->l;
temp->r = temp->r->r;
while (temp->r != nullptr) {
temp = temp->r;
}
temp->r = c;
return;
}
temp = temp->r;
}
}
}
}
void zxbl(Node<T> *x) {
if (x->l != nullptr)zxbl(x->l);
cout << x->val << " ";
if (x->r != nullptr)zxbl(x->r);
}
void print() {
if (root == nullptr) {
cout << "A" << endl;
}
else {
zxbl(root);
}
}
};
int main() {
Tree<int> a;
int n = 50;
a.add(50);
a.add(30);
a.add(70);
a.add(15);
a.add(49);
a.add(55);
a.add(80);
a.cut(49);
a.add(49);
a.print();
getchar();
return 0;
}