C++实现二叉排序树的插入、查询、删除

数据集合{62 88 58 47 35 73 51 99 37 93}
理论上建好的树是这样的
在这里插入图片描述

#include <iostream>
#include <cstdlib>

using namespace std;
typedef struct BiTNode
{
	int data;
	struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

/*排序树搜索操作,如果存在,则返回key值所在节点的指针*/
BiTree Search(BiTree T, int key)
{
	if (!T)
	{
		return NULL;
	}
	if (key == T->data)
	{
		return T;
	}
	else if (key < T->data)
	{
		return Search(T->lchild, key);
	}
	else
		return Search(T->rchild, key);

}

/*二叉树插入操作*/
bool Insert(BiTree &T, int key)
{
	if (!T)
	{
		T = new BiTNode;//为T分配空间
		T->data = key;//数据域赋值
		T->lchild = T->rchild = NULL;
	}
	if (key == T->data)
		return false;
	else if (key < T->data)
		Insert(T->lchild, key);
	else
		Insert(T->rchild, key);
	return true;
}

/*删除操作*/
bool Delete(BiTree &p)
{
	BiTree q, s;
	if (p->rchild == NULL)
	{
		q = p;
		p = p->lchild;//当右子树为空时,将它左孩子替换它,再free掉此结点
		free(q);
	}

	if (p->lchild == NULL)
	{
		q = p;
		p = p->rchild;////当左子树为空时,将它右孩子替换它,再free掉此结点
		free(q);
	}

	else//左右子树都不为空的情况
	{
		q = p;
		s = p->lchild;//将需要删除结点赋值给q,再将左孩子赋值给s
		while (s->rchild)//循环一直找到左子树的右节点的尽头
		{
			q = s;
			s = s->rchild;
		}
		p->data = s->data;
		if (q != p)
		{
			q->lchild = p->rchild;//重接左子树
		}
		else
			q->lchild = s->lchild;//重接右子树
		free(s);
	}
	return true;
}

/*搜索树删除操作*/
bool DeleteT(BiTree &T, int d)
{
	if (!T)
		cout<<"元素不存在";
	else
	{
		if (d == T->data)
		{
			return Delete(T);
		}
		else if (d < T->data)
			return DeleteT(T->lchild, d);
		else
			return DeleteT(T->rchild, d);
	}
}

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

int main()
{
	int key;
	BiTree T = NULL;
	BiTree p = NULL;
	cout<<"输入元素:";
	/*35 37 47 51 58 62 73 88 93 99*/
	for (int i = 0; i < 10; i++)
	{
		cin >> key;
		Insert(T, key);
	}

    cout<<"输入的元素为(中序遍历):";
	InOrder(T);
	cout << endl;

	cout << "输入需要查找的元素:";
    cin >> key;

	p = Search(T, key);
	if (p)
	{
		cout << "找到key值"<<endl;
		cout << "key的左节点数据是 " << p->lchild->data<<endl;
		cout << "key的右节点数据是 " << p->rchild->data<<endl;
	}
	else cout << "没有找到";

	cout << "输入需要删除的元素:";
	cin >> key;

	DeleteT(T, key);
	cout << "删除" << key << "后,搜索树的中序遍历是:" << endl;
	InOrder(T);
	cout << endl;

	system("pause");

}

删除62后的搜索树应该是这样的,它的中序遍历是35 37 47 58 51 73 88 93 99
在这里插入图片描述
下面是代码的运行情况
在这里插入图片描述

运行环境:Visual Stdio 2017
参考书籍:《大话数据结构》

发布了9 篇原创文章 · 获赞 2 · 访问量 667

猜你喜欢

转载自blog.csdn.net/qq_41195985/article/details/103823993