二叉排序树的建立、插入和删除操作

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构B 实验报告
一、 题目要求
1、实验目的
1.熟悉二叉排序树的定义。

2.理解二叉排序树的建立、插入和删除操作的算法。

2、实验题目
本实验要求实现以下功能:
1.对从键盘输入的顺序任意的若干个正整数建立一颗二叉排序树,以-1作
为结束。

2.中序遍历该二叉树,输出遍历结果,查看是否有序。

3.从键盘输入一个整数,在二叉排序树中查找,找到该整数就删除之,没
找到则输出没找到。

输出删除结点后的中序遍历序列。

[测试数据]:
输入序列:67 13 11 88 45 9 60 20 -1
输出中序遍历序列应为:9 11 13 20 45 60 67 88 输入要删除的整数:45 输出删除后的中序遍历序列应为:9 11 13 20 60 67 88
二、设计思路
结构体定义
江苏大学计算机学院
2019年 11 月 20 日
template<class ElemType>
class BinarySortTree
{
protected:
//数据成员
BinTreeNode<ElemType>*root;
public:
BinarySortTree();
~BinarySortTree() {}
bool IsEmpty()const;
BinTreeNode<ElemType>*GetRoot()const;//求二叉树的根
BinTreeNode<ElemType>*Find(const ElemType&key, BinTreeNode<ElemType>*&f)const;//查找关键字为key的数据元素
void Delete(BinTreeNode<ElemType>*&p);//删除关键字为key的数据元素
void CreateTree(BinTreeNode<ElemType>*&r);//创建树
void CreateTree();
void InOrder(void(*Visit)(const ElemType &)) const;
void InOrder(BinTreeNode<ElemType>*r, void(*Visit)(const ElemType&))const;
}
三、源代码
#include"pch.h"
#include<iostream>
using namespace std;
enum Status { SUCCESS, OVER_FLOW, RANGE_ERROR, NOT_PRESENT, ENTRY_FOUND, UNDER_FLOW };//成功,越界,范围错误,未找到
const int MaxSize = 50;
template<class ElemType>
struct Node
{
ElemType data;
Node<ElemType>*next;
Node();//普通构造函数
Node(ElemType e, Node<ElemType>*link = NULL);//带形参的构造函数
};
template<class ElemType>
Node<ElemType>::Node()
{
next = NULL;
}
template<class ElemType>
Node<ElemType>::Node(ElemType e, Node<ElemType>*link)
{
data = e;
next = link;
}
template<class ElemType>
struct BinTreeNode
{
ElemType data;
BinTreeNode<ElemType>*leftChild;
BinTreeNode<ElemType>*rightChild;
BinTreeNode();
BinTreeNode(const ElemType &d, BinTreeNode<ElemType> *lChild = NULL,
BinTreeNode<ElemType> *rChild = NULL);
};
template<class ElemType>
BinTreeNode<ElemType>::BinTreeNode()
{
leftChild = rightChild = NULL;
}
template <class ElemType>
BinTreeNode<ElemType>::BinTreeNode(const ElemType &d, BinTreeNode<ElemType> *lChild, BinTreeNode<ElemType> *rChild)
{
data = d; // 数据元素值
leftChild = lChild; // 左孩子
rightChild = rChild; // 右孩子
}
//二叉排序树的类模板
template<class ElemType>
class BinarySortTree
{
protected:
//数据成员
BinTreeNode<ElemType>*root;
public:
BinarySortTree();
~BinarySortTree() {}
bool IsEmpty()const;
BinTreeNode<ElemType>*GetRoot()const;//求二叉树的根
BinTreeNode<ElemType>*Find(const ElemType&key, BinTreeNode<ElemType>*&f)const;//查找关键字为key的数据元素
bool Insert(const ElemType &e);//插入数据元素e
void Delete(BinTreeNode<ElemType>*&p);//删除关键字为key的数据元素
void CreateTree(BinTreeNode<ElemType>*&r);//创建树
void CreateTree();
void InOrder(void(*Visit)(const ElemType &)) const;
void InOrder(BinTreeNode<ElemType>*r, void(*Visit)(const ElemType&))const; };
template<class ElemType>
BinarySortTree<ElemType>::BinarySortTree()
{
root = NULL;
}
template<class ElemType>
bool BinarySortTree<ElemType>::IsEmpty()const
{
return (root == NULL) ? 1 : 0;
}
template<class ElemType>
BinTreeNode<ElemType> *BinarySortTree<ElemType>::GetRoot()const
{
return root;
}
template<class ElemType>
BinTreeNode<ElemType> *BinarySortTree<ElemType>::Find(const ElemType&key, BinTreeNode<ElemType>*&f)const
{
BinTreeNode<ElemType>*p = GetRoot();
f = NULL;
while (p != NULL && p->data != key)
{
if (key < p->data)
{
f = p;
p = p->leftChild;
}
else
{
f = p;
p = p->rightChild;
}
}
return p;
}
template<class ElemType>
bool BinarySortTree<ElemType>::Insert(const ElemType &e)
{
BinTreeNode<ElemType>*f;
if (Find(e, f) == NULL)
{
BinTreeNode<ElemType>*p;
p = new BinTreeNode<ElemType>(e);
if (IsEmpty())
root = p;
else if (e < f->data)
f->leftChild = p;
else
f->rightChild = p;
return true;
}
else return false;
}
template <class ElemType>
void BinarySortTree<ElemType>::Delete(BinTreeNode<ElemType> *&p)
{
BinTreeNode<ElemType> *tmpPtr, *tmpF;
if (p->leftChild == NULL && p->rightChild == NULL) //p为叶子结点
{
delete p; p = NULL;
}
else if (p->leftChild == NULL) //p的左子树为空,右孩子代替自己
{
tmpPtr = p; p = p->rightChild; delete tmpPtr;
}
else if (p->rightChild == NULL) //p的右子树为空,左孩子代替自己
{
tmpPtr = p; p = p->leftChild; delete tmpPtr;
}
else { //p左右子树都在,采用前述方案一
tmpF = p; tmpPtr = p->leftChild;
while (tmpPtr->rightChild != NULL)//寻找p的左子树中关键字最大的结点
{
tmpF = tmpPtr; tmpPtr = tmpPtr->rightChild;
}
p->data = tmpPtr->data;//将tmpPtr结点的数据值赋值给待删结点
//删除tmpPtr结点
if (tmpF->rightChild == tmpPtr)
Delete(tmpF->rightChild);
else
//待删结点p左子树中只有一个结点,tmpF==p,tmpPtr==tmpF->leftChild
Delete(tmpF->leftChild);
}
}
template<class ElemType>
void BinarySortTree<ElemType>::CreateTree()
{
cout <<"请输入若干个整数,以-1结束(67 13 11 88 45 9 60 20 -1)"<< endl;
int num;
int i = 1;
while (i <= 11)
{
cin >> num;
if (num == -1)
break;
Insert(num);
i++;
}
}
template<class ElemType>
void BinarySortTree<ElemType>::InOrder(BinTreeNode<ElemType>*r, void(*Visit)(const ElemType&))const
{
if (r != NULL)
{
InOrder(r->leftChild, Visit);
(*Visit)(r->data);
InOrder(r->rightChild, Visit);
}
}
template <class ElemType>
void BinarySortTree<ElemType>::InOrder(void(*Visit)(const ElemType &)) const
{
InOrder(root, Visit);
}
template<class ElemType>
void Display(const ElemType &e)
{
cout << e << " ";
}
int main()
{
BinarySortTree<int>tree;
tree.CreateTree();
tree.InOrder(Display);
cout << endl;
int key;
BinTreeNode<int>*f;
cout <<"请输入要查找的数据:\n";
cin >> key;
if (tree.Find(key, f) != NULL)
cout <<"查找成功!\n";
else cout <<"查找失败!\n";
int DelData;
cout <<"请输入数据:";
cin >> DelData;
BinTreeNode<int>*DelNode;
DelNode = new BinTreeNode<int>(DelData);
tree.Delete(DelNode);
cout <<"删除成功!";
tree.InOrder(Display);
system("pause");
}
四、运行结果
二叉排序树:。

相关文档
最新文档