1. 编写SearchBST(T, key)与InsertBST(T, key)的伪代码,并实现;
SearchBST(T,key)
伪代码:
if (T为空 || T的值等于key)返回T
if (T的值 > key)Search(T->lchid, key)
if (T的值 < key)Search(T->rchid, key)
代码:
void Search(BiTree T, char key) {
if (T == NULL || T->data == key)return;
if (T->data > key)Search(T->lchild, key);
if (T->data < key)Search(T->rchild, key);
}
InsertBST(T, key)
伪代码:
if (T为空) {
建立新节点
新节点的值为key
}
if (T == key)返回T
if (T->data > key)InsertBST(T->lchild,key)
if (T->data < key)InsertBST(T->rchild,key)
代码:
int InsertBST(BiTree& T, char key) {
if (T == NULL) {
T = new BiTNode;
T->data = key;
T->lchild == NULL;
T->rchild == NULL;
return 1;
}
if (T->data == key)return 0;
if (T->data > key)return InsertBST(T->lchild, key);
if (T->data < key)return InsertBST(T->rchild, key);
}
2. 编写CreateBST(T)的伪代码实现从控制台输入创建BST树。最后使用代码实现。使用“50 30 80 20 40 90 10 25 35 85 23 88”创建BST,并中序输出该BST
CreateBST(T)
伪代码:
初始化树T
while (i < n) {
使用插入节点的函数InsertBST进行创建
i++
}
返回T
代码:
BiTNode *CreatBST(int a[], int n) {
BiTNode *T = NULL;
int i = 0;
while (i < n) {
InsertBST(T, a[i]);
i++;
}
return T;
}
创建树并中序输出
3. 编写DeleteBST(T, key)的伪代码实现从T中删除关键字key。
DeleteBST(bt,k)
伪代码:
if(bt为空)返回0
else {
if(k<bt->data)返回递归DeleteBST(bt->lchild,k)
else if(k>bt->data)返回递归DeleteBST(bt->rchild,k)
else {
引用函数Delete(bt)来删除关键字为k的节点
返回1
}
}
代码:
int DeleteBST(BiTNode*& bt, char k) {
if (bt == NULL)return 0;
else {
if (k < bt->data)return DeleteBST(bt->lchild, k);
else if (k > bt->data)return DeleteBST(bt->rchild, k);
else {
Delete(bt);
return 1;
}
}
}
Delete(p)
伪代码:
创建一个节点q
if (p的右孩子为空) {
q = p;
p=p的左孩子//让被删除节点的左孩子放到被删除节点上
删除节点q
}
else if (p的左孩子为空) {
q = p;
p = p的右孩子//让被删除节点的右孩子放到被删除节点上
删除节点q
}
当p节点的左右孩子都存在时引用Delete1函数
代码:
void Delete(BiTNode*& p) {
BiTNode* q;
if (p->rchild == NULL) {
q = p;
p = p->lchild;
free(q);
}
else if (p->lchild == NULL) {
q = p;
p = p->rchild;
free(q);
}
else Delete1(p, p->lchild);
}
Delete1(p,r)
伪代码:
创建节点q
if(删除节点的左子树的右子树不为空)递归Delete1找到被删除节点的左子树 的最右下节点
else {
将最右下节点的值赋给被删除节点
再将最右下节点放在被删节点上
删除节点q
}
代码:
void Delete1(BiTNode* p, BiTNode*& r) {
BiTNode* q;
if (r->rchild != NULL) {
Delete1(p, r->rchild);
}
else {
p->data = r->data;
q = r;
r = r->lchild;
free(q);
}
}