二叉排序树的实现

数构作业:二叉排序树的实现

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);
	}
}
运行截图:

image-20200419212908771

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.如果左右子树都存在,则寻找删除节点的直接前驱(即左子树里面的最右的节点)
posted @ 2020-04-19 21:56  Sogger  阅读(210)  评论(0编辑  收藏  举报