二叉排序树查找,插入和删除实现(C++)

本文介绍了二叉排序树查找,插入和删除C++实现过程。代码如下:

#include<iostream>

using namespace std;

typedef int TypeName;

struct Node
{
	TypeName data;
	Node *lchild, *rchild;
};

typedef Node* Tree;

void Creat_Tree(Tree &T);
bool SearchTree(Tree T, int key, Tree f, Tree &p);
bool InsertTree(Tree &T, int key);
bool ShowTree(const Tree &T);
bool DeleteBST(Tree &T, int key);
bool Delete_Node(Tree &T);

void main()
{
	Tree T = nullptr;
	cout << "Enter number(62 58 47 35 0 37 0 0 51 0 0 0 88 73 0 0 99 93 0 0 0): \n";
	Creat_Tree(T);

	Tree p;
	if (SearchTree(T, 73, nullptr, p))
		cout << p << ": " << p->data << endl;
	else
		cout << "There is no key!\n" << endl;

	Tree T1 = nullptr;
	int num[] = { 62, 58, 47, 35, 37, 51, 88, 73, 99, 93 };
	for (int temp : num)
		InsertTree(T1, temp);
	if (InsertTree(T1, 95)) {
		ShowTree(T1);
		cout << endl;
	}
	else
		cout << "Insert fail!" << endl;

	if (DeleteBST(T1, 62)) {
		ShowTree(T1);
		cout << endl;
	}
	else
		cout << "Delete fail!" << endl;

}

void Creat_Tree(Tree &T)
{
	TypeName temp;
	cin >> temp;
	if (temp == 0) {
		T = nullptr;
	}
	else {
		T = new Node;
		T->data = temp;
		Creat_Tree(T->lchild);
		Creat_Tree(T->rchild);
	}
}

bool SearchTree(Tree T, int key, Tree f, Tree &p)
{
	if (!T) {
		p = f;
		return false;
	}
	else {
		if (T->data == key) {
			p = T;
			return true;
		}
		else if (T->data > key)
			SearchTree(T->lchild, key, T, p);
		else
			SearchTree(T->rchild, key, T, p);
	}
}

bool InsertTree(Tree &T, int key)
{
	Tree p, s;
	if (!SearchTree(T, key, nullptr, p)) {
		s = new Node;
		s->data = key;
		s->lchild = nullptr;
		s->rchild = nullptr;
		if (!p)
			T = s;
		else if (p->data > key)
			p->lchild = s;
		else
			p->rchild = s;
		return true;
	}
	else
		return false;
}

bool ShowTree(const Tree &T)
{
	if (T == nullptr)
		return false;
	else
	{
		cout << T->data << " ";
		ShowTree(T->lchild);
		ShowTree(T->rchild);
	}
	return true;
}

bool DeleteBST(Tree &T, int key)
{
	if (!T)
		return false;
	else {
		if (T->data == key)
			Delete_Node(T);
		else if (T->data > key)
			DeleteBST(T->lchild, key);
		else
			DeleteBST(T->rchild, key);
	}
}

bool Delete_Node(Tree &p)
{
	Tree q, s;
	if (p->lchild == nullptr) {
		p = p->rchild;
		delete p;
	}
	else if (p->rchild == nullptr) {
		p = p->lchild;
		delete p;
	}
	else {
		q = p; s = p->lchild;
		while (s->rchild) {
			q = s; s = s->rchild;
		}
		p->data = s->data;
		if (q != p)
			q->rchild = s->lchild;
		else
			q->lchild = s->lchild;
		delete s;
	}
	return true;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值