数构作业:二叉排序树的实现
1. 编写SearchBST(T, key)与InsertBST(T, key)的伪代码,并实现;
伪代码:
void SearchBST(T, key) {
if ( T为空 || T->data等于key ) {
返回 T;
}
if (key 小于 T->data) {
返回 SearchBST(T->lchild, key);
}
else {
返回 SearchBST(T->rchild, key);
}
}
void InsertBST(T, key) {
if ( T为空 ) {
初始化T;
T的左右子树 = NULL;
T->data = key;
返回 true;
}
else if (key 等于 T->data) {
返回 flase;
}
else if (key 小于 T->data) {
返回 InsertBST(T->lchild, key);
}
else if (key 大于 T->data) {
返回 InsertBST(T->rchild, key);
}
}
代码实现:
BSTree SearchBST(BSTree T, KeyTyped key) {
if (!T || T->data == key) {
return T;
}
if (key < T->data) {
return SearchBST(T->lchild, key);
}
else {
return SearchBST(T->rchild, key);
}
}
bool InsertBST(BSTree& T, KeyTyped key) {
if (!T) {
T = new BSTNode;
T->data = key;
T->lchild = NULL;
T->rchild = NULL;
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);
}
}
2. 编写CreateBST(T)的伪代码实现从控制台输入创建BST树。最后使用代码实现。使用“50 30 80 20 40 90 10 25 35 85 23 88”创建BST,并中序输出该BST
伪代码:
void CreateBST(T) {
新建空树T置为NULL;
新建数组a;
for (i = 0; i < n; i++) {
输入关键字a[i];
}
while (i < n) {
InsertBST(T, a[i]);
}
返回 T;
}
代码实现:
BSTree CreateBST(KeyTyped a[], int n) {
int i = 0;
BSTree T = NULL;
while (i < n) {
InsertBST(T, a[i]);
i++;
}
return T;
}
程序完整代码:
#include<iostream>
using namespace std;
typedef int KeyTyped;
typedef struct BiTNode {
int data;
struct BiTNode* lchild, * rchild;
}BSTNode, * BSTree;
BSTree SearchBST(BSTree T, KeyTyped key);
bool InsertBST(BSTree& T, KeyTyped key);
BSTree CreateBST(KeyTyped a[], int n);
void InOrderTraverse(BSTree T);
int main() {
int a[10000];
int n, i;
printf("请输入结点个数:");
cin >> n;
printf("请输入各个结点的值:");
for (i = 0; i < n; i++) {
cin >> a[i];
}
BSTree root = CreateBST(a, n);
printf("中序遍历为:");
InOrderTraverse(root);
return 0;
}
BSTree SearchBST(BSTree T, KeyTyped key) {
if (!T || T->data == key) {
return T;
}
if (key < T->data) {
return SearchBST(T->lchild, key);
}
else {
return SearchBST(T->rchild, key);
}
}
bool InsertBST(BSTree& T, KeyTyped key) {
if (!T) {
T = new BSTNode;
T->data = key;
T->lchild = NULL;
T->rchild = NULL;
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);
}
}
BSTree CreateBST(KeyTyped a[], int n) {
int i = 0;
BSTree T = NULL;
while (i < n) {
InsertBST(T, a[i]);
i++;
}
return T;
}
void InOrderTraverse(BSTree T) {
if (T != NULL) {
InOrderTraverse(T->lchild);
cout << T->data << " ";
InOrderTraverse(T->rchild);
}
}
运行截图:
3. 编写DeleteBST(T, key)的伪代码实现从T中删除关键字key。如果无法编写出来,请写出在BST中删除关键字key所需注意的事项
伪代码:
void DeleteBST(T, key) {
if (T不为空) {
if (key 等于 T->data) {
新建结点root;
root = T;
T = T->rchild;
释放root;
返回 true;
}
else if (key 小于 T->data) {
DeleteBST(T->lchild, key);
}
else if (key 大于 T->data) {
DeleteBST(T->lchild, key);
}
}
else
返回 false;
}
注意事项:
1.叶子节点直接删除就可以了
2.没有左孩子的节点的话直接嫁接右子树就可以了(没有右孩子的节点的话直接嫁接左子树就可以了)
3.如果左右子树都存在,则寻找删除节点的直接前驱(即左子树里面的最右的节点)