目录
1. 编写SearchBST(T, key)与InsertBST(T, key)的伪代码,并实现;
SearchBST(T,key)的伪代码及代码实现:
/*二叉排序树查找伪代码*/
SearchBST(T, key) {
if (T为空 || T->data等于key) {//递归结束的条件
return T;
}
if (key小于T->data) {
return SearchBST(T->lchild, key);//在左子树中递归查找
}
else {
return SearchBST(T->rchild, key);//在右子树中递归查找
}
}
/*二叉排序树查找代码实现*/
BSTNode* SearchBST(BSTNode* T, int k) {
if (T == NULL || T->key == k) {
return T;
}
if (k < T->key) {
return SearchBST(T->lchild, k);
}
else {
return SearchBST(T->rchild, k);
}
}
InsertBST(T, key)的伪代码及代码实现:
/*二叉排序树插入的伪代码*/
insertBST(T, key) {
//在二叉排序树T中插入一个关键字为key的结点,若插入成功则返回真,否则返回假
if (T为空) {//原树为空,新插入的结点为根节点
初始化T;//申请空间创建新节点T,然后把T的左右孩子都设为NULL
T->data = key;
return true;
}
else if (key等于T->data) {//树种存在相同关键字的结点,返回假
return false;
}
else if (key小于T->data) {
return InsertBST(T->lchild, key);//插入到左子树中
}
else {
return InsertBST(T->rchild, key);//插入到右子树中
}
}
/*二叉排序树插入代码实现*/
bool InsertBST(BSTNode*& bt, int k) {
if (bt == NULL) {
bt = new BSTNode;
bt->key = k;
bt->lchild = bt->rchild = NULL;
return true;
}
else if (k == bt->key) {
return false;
}
else if (k < bt->key) {
return InsertBST(bt->lchild, k);
}
else {
return InsertBST(bt->rchild, k);
}
}
2. 编写CreateBST(T)的伪代码实现从控制台输入创建BST树。最后使用代码实现。使用“50 30 80 20 40 90 10 25 35 85 23 88”创建BST,并中序输出该BST
CreateBST(T)的伪代码:
/*创建二叉排序树的伪代码*/
CreateBST(T) {
T = NULL;// 初始化T为空树
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];//从控制台获取n个结点数,存入数组a[]
}
初始化i = 0;
while (i小于n) {
InsertBST(T, a[i]);//将关键字a[i]插入二叉排序树T中
i++;
}
return T;//返回建立的BST的根指针
}
CreateBST(T)的代码实现:
/*创建二叉排序树的代码实现*/
BSTNode* CreateBST(int a[], int n) {
BSTNode* bt = NULL;
int i = 0;
while (i < n) {
InsertBST(bt, a[i]);
i++;
}
return bt;
}
使用“50 30 80 20 40 90 10 25 35 85 23 88”创建BST,并中序输出该BST
运行结果演示:
完整代码:
#include<iostream>
using namespace std;
typedef int KeyTyped;
typedef struct Node {
int key;
struct Node* lchild;
struct Node* rchild;
}BSTNode;
BSTNode* SearchBST(BSTNode* T, int k);
bool InsertBST(BSTNode*& bt, int k);
BSTNode* CreateBST(int a[], int n);
void InOrder(BSTNode* bt);
int main(){
int i, n, a[100];
printf("请输入二叉排序树的结点个数:");
cin >> n;
printf("请输入二叉排序树结点值:
");
for (i = 0; i < n; i++) {
cin >> a[i];
}
BSTNode* root = CreateBST(a, n);
printf("该二叉树中序遍历序列为:
");
InOrder(root);
return 0;
}
BSTNode* SearchBST(BSTNode* T, int k) {
if (T == NULL || T->key == k) {
return T;
}
if (k < T->key) {
return SearchBST(T->lchild, k);
}
else {
return SearchBST(T->rchild, k);
}
}
bool InsertBST(BSTNode*& bt, int k) {
if (bt == NULL) {
bt = new BSTNode;
bt->key = k;
bt->lchild = bt->rchild = NULL;
return true;
}
else if (k == bt->key) {
return false;
}
else if (k < bt->key) {
return InsertBST(bt->lchild, k);
}
else {
return InsertBST(bt->rchild, k);
}
}
BSTNode* CreateBST(int a[], int n) {
BSTNode* bt = NULL;
int i = 0;
while (i < n) {
InsertBST(bt, a[i]);
i++;
}
return bt;
}
void InOrder(BSTNode* bt) {
if (bt != NULL) {
InOrder(bt->lchild);
printf("%d ", bt->key);
InOrder(bt->rchild);
}
}
3. 编写DeleteBST(T, key)的伪代码实现从T中删除关键字key。如果无法编写出来,请写出在BST中删除关键字key所需注意的事项。
注意事项:
删除操作时必须先进行查找,假设查找结束时p指向要删除的结点,则删除分成以下几种情况:
(1)若p结点是叶子结点,直接删去该叶子结点。
(2)若p只有左(右)子树,直接将其左(右)孩子结点替代结点p。
(3)若p结点同时存在左右子树,可以从其左子树中选择关键字最大的结点r,用结点r的值替代结点p的值,并删除结点r,其原理是用中序前驱替代被删结点。
在实现代码的时候,其实情况(2)包含了情况(1),所以无需为情况(1)另开一个if分支。
伪代码:
DeleteBST(T, key) {//删除函数
if (T不为空树) {
if (key小于T->data) {//递归在左子树中删除为key的结点
return DeleteBST(T->lchild, key);
}
else if (key大于T->data) {//递归在右子树中删除为key的结点
return DeleteBST(T->rchild, key);
}
else {//找到了要删除的结点T
if (T->lchild为空) {//T没有左子树的情况
q = T;
T = T->rchild;//用结点T的右孩子替代它
free(q);
}
else if (T->rchild为空) {//T没有右子树的情况
q = T;
T = T->lchild;//用结点T的左孩子替代它
free(q);
}
else {//T既有左子树又有右子树的情况
Delete(T, T->lchild);//调用Delete函数删除结点T
}
}
}
else {//空树删除失败,返回假
return false;
}
}
Delete(p, r) {//被删结点p有左、右子树,r指向其左孩子
if (r->rchild不为空) {//递归找结点人r的最右下结点
Delete(p, r->rchild);
}
else {//找到了最右下结点r(r没有右子树)
p->data = r->data;//将结点r的值存放到结点p中
q = r;
r = r->rchild;//用结点r的左孩子替代它
free(q);//释放结点q的空间
}
}
4.使用代码实现DeleteBST(T, key)
代码实现:
bool DeleteBST(BSTNode*& bt, int k) {
if (bt == NULL) {
return false;
}
else {
if (k < bt->key) {
return DeleteBST(bt->lchild, k);
}
else if (k > bt->key) {
return DeleteBST(bt->rchild, k);
}
else {
BSTNode* q;
if (bt->lchild == NULL) {
q = bt;
bt = bt->rchild;
free(q);
}
else if (bt->rchild == NULL) {
q = bt;
bt = bt->lchild;
free(q);
}
else {
Delete(bt, bt->lchild);
}
}
}
}
void Delete(BSTNode* p, BSTNode* &r) {
BSTNode* q;
if (r->rchild != NULL) {
Delete(p->rchild);
}
else {
p->key = r->key;
q = r;
r = r->lchild;
free(q);
}
}
运行结果演示:
完整代码:
#include<iostream>
using namespace std;
typedef int KeyTyped;
typedef struct Node {
int key;
struct Node* lchild;
struct Node* rchild;
}BSTNode;
BSTNode* SearchBST(BSTNode* T, int k);
bool InsertBST(BSTNode*& bt, int k);
BSTNode* CreateBST(int a[], int n);
void InOrder(BSTNode* bt);
bool DeleteBST(BSTNode*& bt, int k);
void Delete(BSTNode* p, BSTNode*& r);
int main(){
int i, n, a[100], k;
printf("请输入二叉排序树的结点个数:");
cin >> n;
printf("请输入二叉排序树结点值:
");
for (i = 0; i < n; i++) {
cin >> a[i];
}
BSTNode* root = CreateBST(a, n);
printf("请输入要删除的结点:");
cin>>k;
printf("该二叉树删除前中序遍历序列为:
");
InOrder(root);
printf("
该二叉树删除后中序遍历序列为:
");
DeleteBST(root, k);
InOrder(root);
return 0;
}
BSTNode* SearchBST(BSTNode* T, int k) {
if (T == NULL || T->key == k) {
return T;
}
if (k < T->key) {
return SearchBST(T->lchild, k);
}
else {
return SearchBST(T->rchild, k);
}
}
bool InsertBST(BSTNode*& bt, int k) {
if (bt == NULL) {
bt = new BSTNode;
bt->key = k;
bt->lchild = bt->rchild = NULL;
return true;
}
else if (k == bt->key) {
return false;
}
else if (k < bt->key) {
return InsertBST(bt->lchild, k);
}
else {
return InsertBST(bt->rchild, k);
}
}
BSTNode* CreateBST(int a[], int n) {
BSTNode* bt = NULL;
int i = 0;
while (i < n) {
InsertBST(bt, a[i]);
i++;
}
return bt;
}
void InOrder(BSTNode* bt) {
if (bt != NULL) {
InOrder(bt->lchild);
printf("%d ", bt->key);
InOrder(bt->rchild);
}
}
bool DeleteBST(BSTNode*& bt, int k) {
if (bt == NULL) {
return false;
}
else {
if (k < bt->key) {
return DeleteBST(bt->lchild, k);
}
else if (k > bt->key) {
return DeleteBST(bt->rchild, k);
}
else {
BSTNode* q;
if (bt->lchild == NULL) {
q = bt;
bt = bt->rchild;
free(q);
}
else if (bt->rchild == NULL) {
q = bt;
bt = bt->lchild;
free(q);
}
else {
Delete(bt, bt->lchild);
}
}
}
}
void Delete(BSTNode* p, BSTNode* &r) {
BSTNode* q;
if (r->rchild != NULL) {
Delete(p, r->rchild);
}
else {
p->key = r->key;
q = r;
r = r->lchild;
free(q);
}
}