第二个例子没选好…将就用5.5凑合一下把
#include<iostream>
using namespace std;
typedef struct ElemType {
int key;
}ElemType;
typedef struct BSTNode {
ElemType data;
BSTNode* lchild, * rchild;
}BSTNode, * BSTree;
void DeleteBST(BSTree& T, char key) {
BSTree p = T; BSTree f = NULL;
BSTree q;
BSTree s;
while (p) {
//找到p的位子
if (p->data.key == key) break;
f = p;//f标记p的父节点
if (p->data.key > key) p = p->lchild;
else p = p->rchild;
}
if (!p)return;//如果被删除的节点不存在则return
if (p->lchild && p->rchild) {
//如果被删除的节点同时有左子树和右子树
//可以用左子树中的最大值或右子树中的最小值进行替换
//这里选择用第一种方法
q = p;
s = p->lchild;
while (s->rchild) {
q = s;
s = s->rchild;
}//这里要注意的就是这样移动之后s一定不会存在右子树
p->data = s->data;//用s的值将p进行替换
if (q != p) {
q->rchild = s->lchild;
}
else {
//如果q==p 说明在上面q没有进行移动
//说明s不存在右子树 即s是最大值
q->lchild = s->lchild;
}
delete s;
}
else {
if (p->rchild) {
//如果只有右子树
q = p;
p = p->rchild;
}
else if (p->lchild) {
//如果只有左子树
q = p;
p = p->lchild;//直接用p的左子树进行连接
}
if (!f) {
//如果待删除的节点没有父节点 说明为根节点
T = p;//又因为p只有左孩子/右孩子 p在上述代码中进行了移动 那么就是整个树直接从下一个位置开始
}
else if (q == f->lchild) {
//如果待删除节点在父节点的左子树中
//直接改变父节点的左子树指向
f->lchild = p;
}
else {
f->rchild = p;
}
delete q;
}
}
int main() {
}