数据结构·二叉排序树(创建、插入、删除)

什么是二叉排序树:

二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。是中的一类。在一般情况下,查询效率比链表结构要高。

PS:

这里就不多说了,相信大家都有资料,这边直接上代码,代码里有详细的介绍,希望能帮助到大家

代码测试:

10
66
12
5
80
1
66
30
100
71
3
30
50

代码部分: 

//二叉排序树性质
//1.若它的左子树不为空,则左子树上的所有结点的值均小于它的根结点的值
//2.若它的右子树不为空,则右子树上的所有结点的值均大于它的根节点的值
//3.它的左右子树也是二叉排序树
#include<iostream>
#include<queue>
#include<stack>
using namespace std;

//定义二叉排序树结点
struct BSTNode
{
	int data;
	BSTNode* lchild;
	BSTNode* rchild;
};

//插入函数
void Insert(BSTNode*& T, int data) {//因为要不断地改变指针,所以要用二级指针
	BSTNode* s;
	//如果是空树的话,直接插入到根节点
	if (!T) {
		s = new BSTNode;
		s->data = data;
		s->lchild = s->rchild = NULL;
		T = s;
	}
	else if (data < T->data) {//如果小于根节点则往左继续递归
		Insert(T->lchild, data);
	}
	else if (data > T->data) {//如果大于根节点则往右继续递归
		Insert(T->rchild, data);
	}
}

//创建二叉树函数
void CreatBSTree(BSTNode*& T) {
	T = new BSTNode;
	T = NULL;//要先赋NULL值
	int n;
	cout << "请输入n个整数,代表二叉排序树的结点个数:";
	cin >> n;
	int data;
	for (int i = 0; i < n; i++) {
		cout << "现在请输入第" << i + 1 << "个结点的data值:";
		cin >> data;
		Insert(T, data);
	}
	cout << "二叉树创建成功!" << endl;
}

//先序遍历
void PreOrder(BSTNode* T) {
	if (T != NULL) {
		cout << T->data << " ";
		PreOrder(T->lchild);
		PreOrder(T->rchild);
	}
}

//中序遍历
void InOrder(BSTNode* T) {
	if (T != NULL) {
		InOrder(T->lchild);
		cout << T->data << " ";
		InOrder(T->rchild);
	}
}

//中序非递归遍历
void InOrder_(BSTNode* T) {
	BSTNode* p, * q;
	stack<BSTNode*>s;//创建栈
	p = T;
	//循环条件是p不为空或者栈不为空
	while (p || !s.empty()) {
		if (p) {
			s.push(p);
			p = p->lchild;
		}
		else {
			q = s.top();
			s.pop();
			cout << q->data << " ";
			p = q->rchild;
		}
	}
}

//后序遍历
void LastOrder(BSTNode* T) {
	if (T != NULL) {
		LastOrder(T->lchild);
		LastOrder(T->rchild);
		cout << T->data << " ";
	}
}

//层次遍历
void LevelOrder(BSTNode* T) {
	queue<BSTNode*>q;
	BSTNode* p;
	q.push(T);
	while (!q.empty()) {
		p = q.front();
		q.pop();
		cout << p->data << " ";
		//左孩子不为空
		if (p->lchild != NULL) {
			q.push(p->lchild);
		}
		//右孩子不为空
		if (p->rchild != NULL) {
			q.push(p->rchild);
		}
	}
}

//求树的深度
int GetDepth(BSTNode* T) {
	if (T == NULL)
		return 0;
	int left = GetDepth(T->lchild);
	int right = GetDepth(T->rchild);
	return left > right ? left + 1 : right + 1;
}

//搜索函数
BSTNode* SearchBST(BSTNode* T, int key) {
	if (!T || key == T->data)
		return T;
	else if (key < T->data)
		SearchBST(T->lchild, key);
	else
		SearchBST(T->rchild, key);
}

//删除函数
void DeleteBST(BSTNode* T, int key) {
	//初始化
	BSTNode* p = T;
	BSTNode* f = NULL;
	BSTNode* q = NULL;
	//循环找p->data==key的值,以及它的双亲结点
	while (p) {
		if (key == p->data)
			break;
		f = p;//f为p的双亲结点
		//在左子树找
		if (key < p->data)
			p = p->lchild;
		//在右子树找
		else
			p = p->rchild;
	}
	//如果没找到
	if (!p)
		return;
	//考虑三种情况:左右都不为空、左子树不为空、右子树不为空
	q = p;
	//1.左右都不为空
	if ((p->lchild) && (p->rchild)) {
		BSTNode* s = p->lchild;
		q = p;
		//找到左子树的最右结点,即其直接前驱
		while (s->rchild) {
			q = s;
			s = s->rchild;
		}
		p->data = s->data;//令*p的直接前驱代替*p,即s代替p
		if (q != p)
			q->rchild = s->lchild;//重接*q的右子树
		else
			q->lchild = s->lchild;//重接*q的左子树
		delete s;
		return;
	}
	//2.没有右子树
	else if (p->lchild) {
		//置换
		q = p;//q指向要删除的结点
		p = p->lchild;//p指向它的左孩子
	}
	//3.没有左子树
	else if (p->rchild) {
		//置换
		q = p;//q指向要删除的结点
		p = p->rchild;//p指向它的右孩子
	}
	//4.是叶子结点
	else if (!p->lchild && !p->rchild) {
		//置换
		q = p;
		p = NULL;
	}
	//开始重接删除结点的左孩子或右孩子
	if (!f)
		T = p;//删除的是根节点
	else if (q == f->lchild)
		f->lchild = p;
	else if (q == f->rchild)
		f->rchild = p;
	delete q;
}

int main()
{
	BSTNode* BT;
	CreatBSTree(BT);
	
	//遍历
	cout << "先序遍历如下:" << endl;
	PreOrder(BT);
	cout << endl;

	cout << "中序遍历如下:" << endl;
	InOrder(BT);
	cout << endl;

	cout << "中序非递归遍历如下:" << endl;
	InOrder_(BT);
	cout << endl;

	cout << "后序遍历如下:" << endl;
	LastOrder(BT);
	cout << endl;

	cout << "层次遍历如下:" << endl;
	LevelOrder(BT);
	cout << endl;

	//查找
	int x;
	cout << "请输入您要查找的值:";
	cin >> x;
	BSTNode* temp = SearchBST(BT, x);
	if (temp) {
		cout << "找到了!" << endl;
	}
	else {
		cout << "没有找到!" << endl;
	}

	//删除
	int y;
	cout << "请输入您要删除的值:";
	cin >> y;
	DeleteBST(BT, y);
	//删除完再遍历
	InOrder_(BT);
	cout << endl;

	cout << endl;
	system("pause");
	return 0;
}

输出结果:

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,以下是二叉排序树的基本操作代码: ```c++ #include<iostream> using namespace std; // 二叉搜索树结点结构体 struct BSTNode { int data; BSTNode *left; BSTNode *right; }; // 查找操作 BSTNode* search(BSTNode *root, int x) { if (root == nullptr || root->data == x) { return root; } else if (x < root->data) { return search(root->left, x); } else { return search(root->right, x); } } // 插入操作 BSTNode* insert(BSTNode *root, int x) { if (root == nullptr) { root = new BSTNode; root->data = x; root->left = nullptr; root->right = nullptr; } else if (x < root->data) { root->left = insert(root->left, x); } else { root->right = insert(root->right, x); } return root; } // 查找最小结点 BSTNode* findMin(BSTNode *root) { if (root == nullptr) { return nullptr; } else if (root->left == nullptr) { return root; } else { return findMin(root->left); } } // 删除操作 BSTNode* remove(BSTNode *root, int x) { if (root == nullptr) { return nullptr; } if (x < root->data) { root->left = remove(root->left, x); } else if (x > root->data) { root->right = remove(root->right, x); } else if (root->left != nullptr && root->right != nullptr) { root->data = findMin(root->right)->data; root->right = remove(root->right, root->data); } else { BSTNode *temp = root; if (root->left == nullptr) { root = root->right; } else if (root->right == nullptr) { root = root->left; } delete temp; } return root; } // 中序遍历 void inorder(BSTNode *root) { if (root != nullptr) { inorder(root->left); cout << root->data << " "; inorder(root->right); } } int main() { BSTNode *root = nullptr; root = insert(root, 8); root = insert(root, 3); root = insert(root, 10); root = insert(root, 1); root = insert(root, 6); root = insert(root, 14); root = insert(root, 4); root = insert(root, 7); root = insert(root, 13); inorder(root); // 输出结果为:1 3 4 6 7 8 10 13 14 root = remove(root, 6); inorder(root); // 输出结果为:1 3 4 7 8 10 13 14 return 0; } ``` 以上代码中,`BSTNode` 是二叉搜索树结点的结构体,包含数据 `data` 和左右子树指针 `left` 和 `right`。`search` 函数实现查找操作,`insert` 函数实现插入操作,`findMin` 函数查找最小结点,`remove` 函数实现删除操作,`inorder` 函数实现中序遍历。最后在 `main` 函数中构建二叉搜索树,并进行插入删除、中序遍历等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白凤倚剑归

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值