数据结构-课程设计:二叉排序树的实现

*题目要求:
用顺序和二叉链表作存储结构
1) 回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T;
2) 对二叉排序树T作中序遍历,输出结果;
3) 输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”;
*注意:
写出概要设计,详细设计,系统分析。
例如“概要设计”的内容包括:1、数据结构的设计
主要介绍在实验中采用(或设计)的数据结构以及原因。
2、算法的设计
主要说明本设计从总体上划分几个模块,每个模块需要完成的功能是什么?定义每个模块对应的函数接口,用伪代码(类C或C++)设计每个模块对应的算法。
3、抽象数据类型的设计
根据所设计的数据结构和函数接口,设计抽象数据类型。
*高分悬赏,不断追加!此设计题目为老题目,许多论文网均有,麻烦各位帮我搜一下,有能搜到的原论文的兄弟给我发一下,295288673@qq.com
有更详细的答案么,如原设计文档,麻烦各位去各大论文网帮忙找一下吧,事成再开新问题赠分

晕了,真是好纠结,我在写完下面的代码后,才在网上找了找,居然发现和你的题目完全一样的代码,算了,我就直接发在网上找到的文档和代码给你吧,可怜我写了这么久代码呀。。。。。已发,请注意查收。

代码写好了。
VC下经测试通过。
不过如果你还要论文之类的或者设计文档,我也比较难帮到你了。

#include <iostream>
using namespace std;

class node
{
public:
node(int i):data(i),left(NULL),right(NULL){}
void inorder(node *&root) //中序遍历,符合升序输出
{
if(root!=NULL)
{
inorder(root->left);
cout<<root->data<<' ';
inorder(root->right);
}
}
void insert(node *&ptr,int item) //在查找树中插入元素
{
if(ptr==NULL)
ptr=new node(item);
else if(item<ptr->data)
insert(ptr->left,item);
else insert(ptr->right,item);
}
node *find(node *&ptr,int item) //在查找树中查找元素,找到返回所在结点指针,找不到返回空指针。
{
if(ptr==NULL)
return NULL;
if(ptr->data==item)
return ptr;
else if(item<ptr->data)
find(ptr->left,item);
else find(ptr->right,item);
}
node *&findy(node *&ptr,int item) //在查找树中查找肯定存在的元素,并返回其引用
{
if(ptr->data==item)
return ptr;
else if(item<ptr->data)
findy(ptr->left,item);
else findy(ptr->right,item);
}
node* rl(){return left;}
node* rr(){return right;}
void dele(node *&ptr) //删除值为item所在结点
{
if(ptr->rl()==NULL&&ptr->rr()==NULL)
ptr=NULL;
else if(ptr->rr()==NULL)
ptr=ptr->rl();
else
ptr=ptr->rr();
}
private:
int data;
node *left; //左孩子结点
node *right; //右孩子结点
};

int main()
{
int t,i=0,j;
cout<<"输入数字个数(结点个数):";
cin>>t;
cout<<"输入"<<t<<"个数字,数字之间用空格隔开:";
cin>>j;
node *x=new node(j);
for(;i<t-1;i++)
{
cin>>j;
x->insert(x,j);
}
cout<<"中序遍历为:";
x->inorder(x); //作中序遍历
cout<<"\n输入操作(当输入-1时程序结束):"<<endl;
cin>>j;
while(j!=-1)
{

node *t=x->find(x,j); //定位结点
if(t!=NULL)
{
node *&y=x->findy(x,j);
x->dele(y);
cout<<"中序遍历为:";
x->inorder(x);
}
else cout<<"无"<<j;
cout<<"\n输入操作(当输入-1时程序结束):"<<endl;
cin>>j;
}
return 0;
}

附测试数据一组
8
22 33 1 50 88 99 77 55
33
50
51
55
-1
有什么不明的话可以M我或者留言我。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-06-30
#include<iostream.h>
typedef struct TreeNode
{
int key;
struct TreeNode *left;
struct TreeNode *right;
}treeNode;
class BiSortTree
{
public:
BiSortTree(void);
void desplayTree(void);//显示这个树
void insertTree(int key);//在树中插入一个值
deleteTree(int key);//在树中删除一个值
treeNode* searchTree(int key);//在树中查找一个值
~BiSortTree();
private:
treeNode* buildTree(treeNode* head,int number);//建立一个树
treeNode* search(treeNode* head ,int key);//查找
treeNode* BiSortTree::searchParent(treeNode* head,treeNode* p);//查找出p的父亲节点的指针
treeNode* BiSortTree::searchMinRight(treeNode* head);//找到右子树中最小的节点

void showTree(treeNode* head);//显示
void destroyTree(treeNode* head);//删除
treeNode *Head;
};
/**************以下是建立一个二叉排序树****************/
BiSortTree::BiSortTree()
{
cout<<"建立一棵二叉排序树,请输入你要建树的所有数(以-1 作为结束标志!): "<<endl;
Head=NULL;
int number;
cin>>number;
while(number!=-1)
{
Head=buildTree(Head,number);
cin>>number;
}
}
treeNode* BiSortTree::buildTree(treeNode* head,int number)
{
treeNode *p;
p=new treeNode;
p->key=number;
p->left =p->right=NULL;
if(head==NULL)
{
return p;
}
else
{
if(p->key <head->key)
head->left=buildTree(head->left,number);
else
head->right=buildTree(head->right,number);
return head;
}
}
/*****************以下是在一棵二叉排序树插入一个数***********************************/
void BiSortTree::insertTree(int key)
{
Head=buildTree(Head,key);
}
/*****************以下是在一个二叉排序树查找一个数是否存在*************************/
treeNode* BiSortTree::searchTree(int key)
{
return search(Head,key);
}
treeNode* BiSortTree::search(treeNode* head ,int key)
{
if(head==NULL)
return NULL;
if(head->key==key)
return head;
else
{
if(key<head->key )
return search( head->left,key);

else
return search(head->right,key);
}
}
/************以下是在一个二叉排序树删除一个给定的值*********************************/
BiSortTree::deleteTree(int key)
{
treeNode *p;
p=NULL;
p=search(Head,key);
if(p==NULL)
{
cout<<"Don't find the key";

}
if(p==Head)
{
Head=NULL;

}
else
{
treeNode* parent;
parent=searchParent(Head,p);
if(p->left==NULL&&p->right==NULL)//叶子节点
{
if(parent->left==p)
{
parent->left=NULL;
}
else
{
parent->right=NULL;

}
}
else//非叶子节点
{
if(p->right==NULL)//该节点没有右孩子
{
if(parent->left==p)
{
parent->left=p->left ;
}
else
{
parent->right=p->left;

}
}

else//该点有左右孩子
{
treeNode * rightMinSon,* secondParent;//secondParent为右子树中的最小节点的父亲
rightMinSon=searchMinRight(p->right);
secondParent=searchParent(p->right ,rightMinSon);

secondParent->left=rightMinSon->right;
if(p->right==rightMinSon)//右子树中的最小节点的父亲为p
{
p->right=rightMinSon->right ;
}
p->key=rightMinSon->key ;
}
}
}
}
treeNode* BiSortTree::searchParent(treeNode* head,treeNode* p)
{
if(head->left==p||head->right==p||head==p||head==NULL)
return head;
else
{
if(p->key<head->key)
return searchParent(head->left ,p);
else
return searchParent(head->right ,p);
}
}
treeNode* BiSortTree::searchMinRight(treeNode* head)//找到右子树中最小的节点
{
if(head->left ==NULL||head==NULL)
{
return head;
}
else
{
return searchMinRight(head->left);
}
}
/*****************以下是显示一个二叉排序树****************************************/
void BiSortTree::desplayTree(void)
{

showTree(Head);
cout<<endl;
}
void BiSortTree::showTree(treeNode* Head)
{

if(Head!=NULL)
{
showTree(Head->left ) ;
cout<<Head->key<<' ' ;
showTree(Head->right) ;
}
}
/*****************以下是删除一棵整二叉排序树************************************/
BiSortTree::~BiSortTree()
{
cout<<"已经消除了一棵树!!!!"<<endl;
destroyTree(Head);
}
void BiSortTree::destroyTree(treeNode* head )
{
if(head!=NULL)
{
destroyTree(head->left );
destroyTree(head->right );
delete head;
}
}
/*********************/
void print()
{
cout<<endl<<endl<<"以下是对二叉排序树的基本操作:"<<endl
<<"1.显示树"<<endl
<<"2.插入一个节点"<<endl
<<"3.寻找一个节点"<<endl
<<"4.删除一个节点"<<endl;
}
void main()
{
BiSortTree tree;
int number;
int choiceNumber;
char flag;
while(1)
{
print() ;

cout<<"请选择你要进行的操作(1~4)"<<endl;
cin>>choiceNumber;
switch(choiceNumber)
{
case 1:
tree.desplayTree();break;
case 2:
cout<<"请插入一个数: "<<endl;
cin>>number;
tree.insertTree(number);
tree.desplayTree();
break;

case 3:
cout<<"请插入你要找数: "<<endl;
cin>>number;
if(tree.searchTree(number)==NULL)
{
cout<<"没有发现"<<endl;
}
else
{
cout<<"发现"<<endl;
}
break;
case 4:
cout<<"请输入你要删除的数: "<<endl;
cin>>number;
tree.deleteTree(number);
tree.desplayTree();
break;

default: break;
}
cout<<"你是否要继续(Y/N)?"<<endl;
cin>>flag;
if(flag=='N'||flag=='n')
break;
}
}
第2个回答  2010-06-30
/*以下是用c++ 实现的二叉排序树的源代码*/ #include<iostream.h> typedef struct TreeNode { int... 二叉排序树****************/ BiSortTree::BiSortTree() { cout<<"建立一棵二叉排序树,请输入你要建...

数据结构(二):二叉搜索树(Binary Search Tree)
二叉搜索树是一种节点值之间具有一定数量级次序的二叉树,对于树中每个节点:示例:观察二叉搜索树结构可知,查询每个节点需要的比较次数为节点深度加一。如深度为 0,节点值为 “6” 的根节点,只需要一次比较即可;深度为 1,节点值为 “3” 的节点,只需要两次比较。即二叉树节点个数确定的情况下,...

数据结构题目57:建立一棵二叉排序树
从ki开始依次取序列中的元素,每取出一个数据元素ki,按下列原则建立二叉排序树的一个结点。 1.若二叉排序树为空,则ki就是二叉排序树的根结点。 2.若二叉排序树非空,则将ki与该二叉排序树的跟结点的值进行比较。若ki小于根结点的值,则将ki插入到根结点的左子树中;否则,将ki插入到根结...

数据结构之 二叉树-平衡二叉树(VAL树)
数据结构之平衡二叉树(VAL树)平衡二叉树,又称自平衡二叉搜索树(AVL树),其核心在于维持高效的查询性能。这种数据结构的特点在于,它始终保持两个子树的高度差绝对值不超过1,且这两个子树本身也是平衡的。常见的平衡二叉树实现有红黑树、AVL树、替罪羊树、Treap和伸展树等,它们在二叉排序树(BST)的...

数据结构题 试建立一个二叉排序树,利用以下输入数据顺序 详细如下,并...
一、按此序列构建的二叉排序树:二、前序遍历序列:43, 10, 11, 23, 65, 45, 47, 70, 90 三、删除65,因为该结点度为2,所以可能两种结果:用中序的前驱或者后继替代 1、用中序前驱47替代:2、用中序后继70替代:

二叉树简介
在计算机科学领域,一种基础的数据结构是二叉树,它是一种特殊的树形数据结构,每个节点最多只能拥有两个子节点,分别称为左子树和右子树。这种有序的特性使得二叉树在查找、排序和堆操作中发挥着重要作用,比如作为二叉查找树、二叉堆或二叉排序树的基础。二叉树的每个节点都严格限制了子树的数量,确保了...

求解下面一道数据结构题,重点讲解解题过程。
二叉排序树,首先以18为根结点建二叉树;判断11,比18小,接入以18为根结点的左子树;判断17,比18小,接入以18为根结点的左子树,再判断,比11大,接入以结点11的右子树;判断7,比18小,接入以18为根结点的左子树,再判断,比11小,接入以结点11的左子树;依次类推。前序序列为:18 11 7 5...

二叉搜索树的定义
二叉搜索树的定义:二叉搜索树又称二叉查找树或二叉排序树。一棵二叉搜索树是以二叉树来组织的,可以使用一个链表数据结构来表示,其中每一个结点就是一个对象。一、二叉搜索树的相关定义介绍 除了key和位置数据之外,每个结点还包含属性lchild、rchild和parent,分别指向结点的左孩子、右孩子和双亲(父结点...

数据结构问题,最优二叉树(赫夫曼树)有要求每个左孩子必须大于右孩子吗...
不需要,也可以每个左孩子小于每个右孩子,左面大或右面大都无所谓,但必须统一,要么左边大于右边,要么右边大于左边,否则在霍夫曼树的一些应用中会出错

...的题:试写一个判别给定二叉树是否为二叉排序树的算法,设此二叉树以...
a=当前节点是否为排序树,是为1,不是为0 f(x)=1 当x为叶节点 f(x)= a&&f(x->lchid)&&f(x-rchild) 当x非叶节点 --- int IsAVTree(BiTree t){ int a=1;if(t->Child==NULL&&t->Rchild==NULL) return 1; \/\/叶子节点判断 if((t->Lchild->data>t->data)||(t->Rch...

二叉搜索树是二叉排序树吗
二叉搜索树也被称为二叉排序树(Binary Sort Tree),这是因为树的构造过程本身就是一个排序过程。当我们向二叉搜索树中插入一个新节点时,我们会根据节点值的大小将其放置在正确的位置,以确保树的性质得以维持。因此,中序遍历二叉搜索树会得到一个有序的节点值序列。总的来说,二叉搜索树是一种高效...

相似回答