二叉排序树的实现作业
1、编写SearchBST(T, key)与InsertBST(T, key)的伪代码,并实现;
bintree* SearchBST(bintree* T, int key) {
/*
while(T!=NULL){
if(T的值等于key)return T
else if(key小于T的值)寻找T的左孩子
else 寻找T的右孩子
}
若找不到,返回NULL
*/
}
bintree* InsertBST(bintree* T, int key) {
/*
if(T!=NULL){
建立树结点T,值为key
}
else if(T的值小于key)插入到右子树
else 插入到左子树
返回T
*/
}
bintree* SearchBST(bintree* T, int key) {
while (T) {
if (T->data == key)return T;
else if (T->data < key) T = T->right;
else T = T->left;
}
return NULL;
}
bintree* InsertBST(bintree* T, int key) {
if (!T) {
T = new bintree;
T->data = key;
T->left = T->right = NULL;
}
else if (T->data < key)T->right = InsertBST(T->right, key);
else if (T->data > key) T->left = InsertBST(T->left, key);
return T;
}
2、编写CreateBST(T)的伪代码实现从控制台输入创建BST树。最后使用代码实现。使用“50 30 80 20 40 90 10 25 35 85 23 88”创建BST,并中序输出该BST
bintree* Create(bintree* T) {
/*
while(输入){
InsertBST(T, key)
}
*/
}
bintree* Create(bintree* T) {
/*
while(){
当输入-1时退出
InsertBST(T, key)
}
*/
int n;
while (1) {
cin >> n;
if (n == -1)break;
T = InsertBST(T, n);
}
return T;
}
3、编写DeleteBST(T, key)的伪代码实现从T中删除关键字key。如果无法编写出来,请写出在BST中删除关键字key所需注意的事项。
bintree* Delete(bintree* T, int key) {
/*
if(T==NULL)输出not found
else if (key值小于T值)删除左孩子
else if (key值大于T值)删除右孩子
else if(找到结点T且T结点存在左右孩子){
找到右孩子的最小值代替
}
else{
if(没有左孩子)用右孩子代替
否则用左孩子代替要删除结点
删除
}
return T
*/
}
4、选做:使用代码实现DeleteBST(T, key)
bintree* FindMin(bintree* T) {
if (!T)return NULL;
else if (!T->left)return T;
else return FindMin(T->left);
}
bintree* Delete(bintree* T, int key) {
bintree* tmp;
if (!T)printf("Not Found\n");
else if (key < T->data)T->left = Delete(T->left, key);
else if (key > T->data)T->right = Delete(T->right, key);
else if (T->left && T->right) {
tmp = FindMin(T->right);
T->data = tmp->data;
T->right = Delete(T->right, T->data);
}
else {
tmp = T;
if (!T->left)T = T->right;
else if (!T->right)T = T->left;
delete tmp;
}
return T;
}