要求
自己写一个二叉搜索树。
限制条件
无
输入格式
无
输出格式
无
测试输入
无
测试输出
无
解题思路
删除操作
- 需要 删除的节点没有左二子的话,那么就把右儿子提上去
- 需要 删除的节点的左二子没有右儿子,那么就把左二子提上去
- 以上二种情况都不满足的话,就把左二子的子孙中最大的结点提到需要删除的节点上
代码
#include <iostream>
using namespace std;
template<class T> class Node {
public:
T val;
Node *lch, *rch;
Node(T val) {
this->val = val;
lch = NULL;
rch = NULL;
}
Node() {
val = NULL;
lch = NULL;
rch = NULL;
}
};
template<class T> class MySet {
public:
static Node<T> *insert(Node<T> *p, T x) {
if (p == NULL) {
Node<T> *q = new Node<T>(x);
return q;
} else {
if (x < p->val) {
p->lch = insert(p->lch, x);
} else {
p->rch = insert(p->rch, x);
}
return p;
}
}
static bool find(Node<T> *p, T x) {
if (p == NULL) {
return false;
} else if (x == p->val) {
return true;
} else if (x < p->val) {
return find(p->lch, x);
} else {
return find(p->rch, x);
}
}
static Node<T> *remove(Node<T> *p, T x) {
if (p == NULL) {
return NULL;
} else if (x < p->val) {
p->lch = remove(p->lch, x);
} else if (x > p->val) {
p->rch = remove(p->rch, x);
} else if (p->lch == NULL) {
Node<T> *q = p->rch;
delete p;
return q;
} else if (p->lch->rch == NULL) {
Node<T> *q = p->lch;
q->rch = p->rch;
delete p;
return q;
} else {
Node<T> *q;
for (q = p->lch; q->rch->rch != NULL; q = q->rch) {
}
Node<T> *r = q->rch;
q->rch = r->lch;
r->lch = p->lch;
r->rch = p->rch;
delete p;
return r;
}
return p;
}
};
int main() {
int n;
cin >> n;
Node<int> *head;
for (int i = 0; i < n; i++) {
int temp;
cin >> temp;
if (i == 0) {
head = new Node<int>(temp);
} else {
head = MySet<int> ::insert(head, temp);
}
}
return 0;
}