急!急!求二叉排序树程序
发布网友
发布时间:2022-08-29 19:44
我来回答
共1个回答
热心网友
时间:2024-10-21 19:37
#include <iostream.h>
//二叉排序树类的前视定义
template<class Type> class BSTree;
//二叉排序树结点类的定义
template<class Type>
class BSTreeNode
{friend class BSTree <Type>;
private:
Type data; //数据域(在此为关键字)
BSTreeNode <Type> *leftChild, *rightChild;
public:
BSTreeNode():leftChild(NULL),rightChild (NULL){};//构造函数
BSTreeNode(const Type &d) : data (d), leftChild (NULL),rightChild (NULL) {} ; //构造函数
~BSTreeNode(){}; //析构函数
};
//二叉排序树的类定义
template <class Type>
class BSTree
{
private:
BSTreeNode<Type> * root; //二叉排序树的根指针
void Insert ( const Type & x, BSTreeNode<Type> *&p );
//在p为根的二叉排序树上插入数据元素x
void Delete ( const Type & k, BSTreeNode<Type> *&p );
//在p为根的二叉排序树上删除关键字为k的结点
BSTreeNode<Type> * Min(BSTreeNode<Type> *p);
BSTreeNode<Type> * Find(const Type &k, BSTreeNode<Type> *p );
//在p为根的二叉排序树上查找关键字为k的结点
void InOrder(BSTreeNode<Type> *r);
public:
BSTree() : root (NULL) {}//构造函数
Type Find ( const Type &k ) {//查找
BSTreeNode<Type>* p=Find ( k, root );
if(p==NULL){
cout<<"There is not a node that equals "<<k<<endl;
return NULL;
}
return p->data;
}
void Insert(const Type &x) { Insert ( x, root ); } //插入
void Delete(const Type &k) { Delete ( k, root ); } //删除
void SortDisplay(){InOrder(root);cout<<endl;}
};
template <class Type>
void BSTree<Type>::
Insert(const Type &x, BSTreeNode<Type> * &p) {
//在p为根的二叉排序树插入结点的递归算法
if ( p == NULL ) //空二叉树
p = new BSTreeNode<Type>(x); //创建数据元素x的结点
else if (x<p->data )
//在左子树插入
Insert ( x, p->leftChild );
else if ( x > p->data )
//在右子树插入
Insert ( x, p->rightChild );
else //结点x已存在
{
cout << "There has node x" << endl;
}
}
template <class Type>
BSTreeNode<Type> * BSTree<Type> ::
Find (const Type &k, BSTreeNode<Type> *p) {
//在p为根的二叉排序树上进行查找的递归算法
if ( p == NULL ) return NULL; //查找失败
else if ( k<p->data )
//在左子树上递归查找
return Find (k,p->leftChild );
else if (k>p->data )
//在右子树上递归查找
return Find ( k, p->rightChild );
else return p; //相等,查找成功
}
template <class Type>
void BSTree<Type> ::
Delete(const Type &k, BSTreeNode<Type> * &p){
//在p为根的二叉排序树上删除关键字为k的结点
if ( p != NULL ){
BSTreeNode<Type> * temp;
if ( k < p->data )
Delete ( k, p->leftChild );
else if ( k > p->data )
Delete ( k, p->rightChild );
else if ( p->leftChild != NULL && p->rightChild != NULL ){
BSTreeNode<Type> * tparent=p;
temp=p->rightChild;
while(temp->leftChild!=NULL){
tparent=temp;
temp=temp->leftChild;
}
p->data = temp->data;
if(tparent==p)
Delete ( p->data,tparent->rightChild );
else Delete ( p->data,tparent->leftChild );
}
else {
temp = p;
if ( p->leftChild == NULL )
p = p->rightChild;
else if ( p->rightChild == NULL )
p = p->leftChild;
delete temp;
}
}
}
template <class Type>
void BSTree<Type>::InOrder(BSTreeNode<Type>* r){
if(r!=NULL){
InOrder(r->leftChild);
cout<<r->data<<" ";
InOrder(r->rightChild);
}
}
void main (){
BSTree<int> a;
int x;
cout<<"输入序列:"<<" ";
for(int i=0;;i++){
cin>>x;
if(x==-1)break;
a.Insert(x);
}
cout<<endl;
cout<<"输出中序遍历序列应为:";
a.SortDisplay();
cout<<endl;
cout<<"输入需要删除的整数:"<<" ";
int y;
cin>>y;
cout<<endl;
cout<<"查找结果是:"<<a.Find(y)<<endl;
cout<<endl;
a.Delete(y);
cout<<"输出删除后的中序遍历序列应为:"<<" ";
a.SortDisplay();
}
二叉排序树查找的二叉排序树查找的程序实现:
5. 二叉排序树的删除:假设被删结点是*p,其双亲是*f,不失一般性,设*p是*f的左孩子,下面分三种情况讨论:⑴ 若结点*p是叶子结点,则只需修改其双亲结点*f的指针即可。⑵ 若结点*p只有左子树PL或者只有右子树PR,则只要使PL或PR 成为其双亲结点的左子树即可。⑶ 若结点*p的左、右子树均非空,...
将整数序列{4,5,7,2,1,3,6}中的数依此插入到一棵空的二叉排序树中...
将整数序列{4,5,7,2,1,3,6}中的数依次插入到一棵空的二叉排序树中,相应的二叉排序树是:平均查找长度=1*1+2*2+3*3+4*3=26 (第一层一个结点,每个结点比较一次查找成功;第二层两个结点,每个结点比较两次查找成功;第三层三个结点,每个结点比较三次查找成功;第四层三个结点,每个结点...
设计一个读入一串整数构成一棵二叉排序树的算法
1、若根结点的左子树非空,则左子树上所有结点的关键字值均小于等于根结点的关键字值。2、若根结点的右子树非空,则右子树上所有结点的关键字值均大于等于根结点的关键字值。3、根结点的左、右子树也分别为二叉排序树。二叉排序树建立说明:当需要插入一个节点到二叉排序树时,需要先找到它的父节点。
假设一棵二叉树的按层次遍历序列为abcdefghij,中序遍历序列为dbgehjac...
(3)左、右子树也分别为二叉排序树;
二叉排序树的应用
二叉排序树(Binary Sort Tree),首先它是一棵树,“二叉”这个描述已经很明显了,就是树上的一根树枝开两个叉,于是递归下来就是二叉树了(下图所示),而这棵树上的节点是已经排好序的,具体的排序规则如下:若左子树不空,则左子树上所有节点的值均小于它的根节点的值 若右子树不空,则右字数上...
用VB编写 二叉树的建立与遍历、二叉树的排序
将原程序和实验结果存入计算机室服务器或软盘后,交由指导老师或有关实验人员保存。实验五 二叉树的排序 一、实验名称 二叉树的排序。二、实验目的 通过该实验,进一步熟悉二叉树的建立方法,掌握二叉排序树的建立和使用。三、实验内容 (1)根据中序遍历,建立一棵二叉排序树用二叉链表存储;(2)给出...
帮我看看这个程序,按照所生成的随机样本顺序生成对应二叉排序树...
void Insert (BinTree *T,BinTree *s){ BinTree *f,*p=T;while (p){ f=p;if(s->keykey)p=p->llink;else p=p->rlink;};if(T==NULL)T=s;//这里,函数参数都是传值的,所以这里的赋值,影响不到CreateTree函数里的T值。else if(s->key<f->key)f->llink=s;else f->rli...
编写程序,用先序递归遍历法建立二叉树的二叉链表存储结构,输出其先序...
BiTNode *bulid() /*建树*/ { BiTNode *q;BiTNode *s[20];int i,j;char x;printf("请按顺序输入二叉树的结点以输入0和*号结束\n");printf("请输入要输入的为第几个结点i=\n");scanf("%d",&i);printf("请输入你要输入该结点的数为x=");getchar();scanf("%c",&x);while(i!=...
利用二叉排序树,统计随机从键盘上输入的字符个数,然后输出字符和对应...
1、统计字符串中字符出现的次数 编写一个程序,由键盘输入一个字符串,统计该字符串中出现的字符及其次数。然后输出结果。要求用一个二叉树来保存处理结果,字符串中每个不同的字符用树的结点表示,结点应该包含四个域:该字符、该字符出现的次数、左子树指针、右子树指针;其中左子树的字符的ASCII码均...
...15},假定每个结点的查找概率相同,若按二叉排序树组织该
回答:总查找次数N=1+2+3+…+n=n(n+1)/2,则平均查找长度为N/n=(n+1)/2。 依次插入数列中的数字得到二叉排序树,最后树的深度为7,根据每个结点所在行数加起来除以结点个数