今天发现了程序的最后一个bug(可能吧),话说二叉搜索树的删除真的太折磨我了,我在这上面吃尽了苦头。先开更改后的代码,在讲解我原本的思路错在哪里。
void Deletemath(struct tree* root, int x,int h) {
struct tree* fa = NULL, * p = NULL, * s = NULL;
p = root;
fa = p;
while (p->data.math != x || p->data.hash != h) {
fa = p;
if (x > p->data.math && p->rc != NULL) {
p = p->rc;
}
else if (x <= p->data.math && p->lc != NULL) {
p = p->lc;
}
}
if (p->lc == NULL && p->rc == NULL) {
if (p == rootmath) {
rootmath = NULL;
}
else {
if (fa->lc == p) {
fa->lc = NULL;
}
else {
fa->rc = NULL;
}
}
}
else if (p->lc == NULL || p->rc == NULL) {
if (p->lc != NULL) {
if (p == rootmath) {
rootmath = p->lc;
}
else {
if (fa->lc == p) {
fa->lc = p->lc;
}
else {
fa->rc = p->lc;
}
}
}
else {
if (p == rootmath) {
rootmath = p->rc;
}
else {
if (fa->lc = p) {
fa->lc = p->rc;
}
else {
fa->rc = p->rc;
}
}
}
}
else if (p->lc != NULL && p->rc != NULL) {
struct tree* t = p;
s = p->rc;
while (s->lc != NULL) {
t = s;
s = s->lc;
}
p->data = s->data;
if (p == t) {
p->rc = s->rc;
}
else {
t->lc = s->rc;
}
}
}
问题出在这里:
p->data = s->data;
我原本的代码为:p->data=t->data;。t为s的父节点,这里如果直接交换p和t的值在节点为根节点时就会出现问题。
今天蓝桥杯出成绩了,省二,对摆烂的自己来说已经是一个很不错的成绩了,我想我应该可以更好,明天就要答辩了,好好休息了。