二叉查找树(BST)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Wchenchen0/article/details/82777192

可以称为:排序二叉树,二叉搜索树,二叉排序树,二叉查找树

1.查找操作:普通二叉树无法确定具体性质,因此只能对左右子树都进行递归遍历。但是二叉查找树性质可以选择其中一个子树进                      行遍历。

void search(tree bt, int x)
{
	if (bt == NULL) {
		cout << "fail" << endl;
		return;
	}
	if (x == bt->data) cout << "find" << endl;
	else if (x < bt->data) search(bt->L, x);
	else if (x > bt->data) search(bt->R, x);
}

2.插入操作:二叉树结点插入位置就是数据域在二叉树中查找失败的位置(注意&)

void insert(tree &bt, int x)
{
	if (bt == NULL) {
		bt = new node;
		bt->data = x;
		bt->L = bt->R = NULL;
	}
	if (bt->data == x) return;
	else if (x < bt->data) insert(bt->L, x);
	else insert(bt->R, x);
}

3.二叉查找树的建立:一组相同的数字,如果插入它们的顺序不同,最后二叉查找树也可能不同,例如插入{5,3,7,4,2,8,6}与

                                   {7,4,5,8,2,6,3};

tree bt = NULL;
void Greate(int s[], int n)
{
	for (int i = 0;i < n;i++) {
		insert(bt, s[i]);
	}
}

 4,二叉查找树的删除:

    查找操作:

//寻找以root为根结点的树中的最大权值结点
tree findMax(tree root)
{
	while (root->R != NULL) {
		root = root->R;//不断往右,直到没有右孩子
	}
	return root;
}

//寻找以root为结点的树中的最小权值结点
tree findMin(tree root)
{
	while (root->L != NULL) {
		root = root->L;//不断往左,直到没有左儿子
	}
	return root;
}

删除操作:

void deleteNode(tree &bt, int x)
{
	if (bt == NULL) return;//不存在权值为x的结点
	if (bt->data == x) {//找到欲删除结点
		if (bt->L == NULL && bt->R == NULL)//叶结点直接删除
			bt = NULL;//把bt地址设为NULL,父节点就引用不到它了
		else if (bt->L != NULL) {
			tree pre = findMax(bt->L);//找到bt前驱
			bt->data = pre->data;//用前驱覆盖bt
			deleteNode(bt->L, pre->data);//在左子树中删除结点pre
		}
		else {
			tree next = findMin(bt->R);//找到bt后驱
			bt->data = next->data;//用后驱覆盖bt
			deleteNode(bt->R, next->data);//在右子树中删除结点next
		}
	}
	else if (x < bt->data) deleteNode(bt->L, x);//在左子树中删除x
	else deleteNode(bt->R, x);//在右子树中删除x
}

完整代码:

#include<iostream>
using namespace std;
typedef struct node;
typedef node *tree;
struct node
{
	int data;
	tree L;
	tree R;
};
int s[] = { 5,3,7,4,2,8,6 };

//寻找以root为根结点的树中的最大权值结点
tree findMax(tree root)
{
	while (root->R != NULL) {
		root = root->R;//不断往右,直到没有右孩子
	}
	return root;
}

//寻找以root为结点的树中的最小权值结点
tree findMin(tree root)
{
	while (root->L != NULL) {
		root = root->L;//不断往左,直到没有左儿子
	}
	return root;
}
//删除以bt为结点的树中权值为x的结点
void deleteNode(tree &bt, int x)
{
	if (bt == NULL) return;//不存在权值为x的结点
	if (bt->data == x) {//找到欲删除结点
		if (bt->L == NULL && bt->R == NULL)//叶结点直接删除
			bt = NULL;//把bt地址设为NULL,父节点就引用不到它了
		else if (bt->L != NULL) {
			tree pre = findMax(bt->L);//找到bt前驱
			bt->data = pre->data;//用前驱覆盖bt
			deleteNode(bt->L, pre->data);//在左子树中删除结点pre
		}
		else {
			tree next = findMin(bt->R);//找到bt后驱
			bt->data = next->data;//用后驱覆盖bt
			deleteNode(bt->R, next->data);//在右子树中删除结点next
		}
	}
	else if (x < bt->data) deleteNode(bt->L, x);//在左子树中删除x
	else deleteNode(bt->R, x);//在右子树中删除x
}
void search(tree bt, int x)
{
	if (bt == NULL) {
		cout << "fail" << endl;
		return;
	}
	if (x == bt->data) cout << "find" << endl;
	else if (x < bt->data) search(bt->L, x);
	else if (x > bt->data) search(bt->R, x);
}
void insert(tree &bt, int x)
{
	if (bt == NULL) {
		bt = new node;
		bt->data = x;
		bt->L = bt->R = NULL;
	}
	if (bt->data == x) return;
	else if (x < bt->data) insert(bt->L, x);
	else insert(bt->R, x);
}

tree bt = NULL;
void Greate(int s[], int n)
{
	for (int i = 0;i < n;i++) {
		insert(bt, s[i]);
	}
}

void print(tree bt)
{
	if (bt) {
		cout << bt->data << endl;
		print(bt->L);
		print(bt->R);
	}
}
int main()
{
	Greate(s, 7);
	//print(bt);
	search(bt, 4);
	search(bt, 1);
	deleteNode(bt, 5);
	cout << "dfasf" << endl;
	print(bt);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Wchenchen0/article/details/82777192