二叉搜索树的基本操作二.实验内容设在一棵二叉搜索树的每个结点的data域中,含有关键字key域和统计相同关键字元素个数的count域.当向该树插入一个元素时,若树中已有相同关键字值的结点,

来源:学生作业帮助网 编辑:作业帮 时间:2024/04/29 19:40:34
二叉搜索树的基本操作二.实验内容设在一棵二叉搜索树的每个结点的data域中,含有关键字key域和统计相同关键字元素个数的count域.当向该树插入一个元素时,若树中已有相同关键字值的结点,

二叉搜索树的基本操作二.实验内容设在一棵二叉搜索树的每个结点的data域中,含有关键字key域和统计相同关键字元素个数的count域.当向该树插入一个元素时,若树中已有相同关键字值的结点,
二叉搜索树的基本操作
二.实验内容
设在一棵二叉搜索树的每个结点的data域中,含有关键字key域和统计相同关键字元素个数的count域.当向该树插入一个元素时,若树中已有相同关键字值的结点,则使该结点的count域值增1,否则由该元素值生成一个新结点插入到该树中,并使其count域置为1.当向该树删除一个元素时,若树中该元素结点的count域值大于1,则使该结点的count域值减1,否则(count域值等于1)删除该结点.请编写程序实现该二叉搜索树的下述基本操作:
初始化该二叉搜索树void InitBSTree(BTreeNode *&bst);
以广义表形式输出该二叉搜索树(每个结点输出内容包括关键字值与相同元素个数值)void PrintBSTree(BTreeNode *bst);
插入一个元素到该二叉搜索树(用非递归算法实现) void Insert (BTreeNode *&bst,ElemType item);
从二叉搜索树中删除某个元素(用非递归算法实现) int Delete (BTreeNode *&bst ,ElemType item).
求该二叉搜索树的最大关键字值(用非递归算法实现)ElemType MaxBSTree(BTreeNode *bst).
把二叉搜索树的结构定义及基本操作实现函数存放在文件BSTree.h中.
建立主程序文件test5.cpp,在主函数main()中通过调用BSTree.h中的函数进行测试.提示:可以在主函数中首先初始化二叉搜索树;然后从键盘输入数据,通过循环调用插入算法建立二叉搜索树;再以广义表形式输出该二叉搜索树;输出二叉搜索树中的最大结点值;最后调用删除算法删除某元素,并输出删除后的二叉搜索树.

二叉搜索树的基本操作二.实验内容设在一棵二叉搜索树的每个结点的data域中,含有关键字key域和统计相同关键字元素个数的count域.当向该树插入一个元素时,若树中已有相同关键字值的结点,

哈哈,居然有人来提问了,城院的 

我刚奋斗了2小时做了下,你看看对不?

Test5.cpp:

#include <iostream.h>

#include <stdlib.h>

typedef double ElemType;

#define Maxsize 100

#include "BSTree.h"

void main()

{

 int i,n;

 ElemType x;

 ElemType a[Maxsize];

 BTreeNode *bst;

    InitBSTree(bst);

    cout<<"请输入你所要测试的二叉搜索树的结点的个数:";

    cin>>n;

    cout<<"请输入你要测试的二叉搜索树:"<<endl;

    for(i=0;i<n;i++){

  cin>>a[i];  

 }

 CreateBSTree(bst,a,n);

    cout<<"你输入的二叉搜索树的广义表形式为:";

    PrintBSTree(bst);

    cout<<endl;

 cout<<"输入一个待插入结点的整数值:";

 cin>>x;

 Insert(bst,x);

 cout<<"插入结点后的二叉搜索树的广义表形式为:";

 PrintBSTree(bst);

 cout<<endl;

 cout<<"输入一个待删除结点的值:";

 cin>>x;

    if(Delete(bst,x)) cout<<"删除元素"<<x<<"成功!"<<endl;

 else cout<<"删除元素"<<x<<"失败!"<<endl;

 PrintBSTree(bst);

 cout<<endl;

 cout<<"该二叉搜索树中的最大值为:"<<MaxBSTree(bst)<<endl;

}

BSTree.h:

struct BTreeNode{

 ElemType data;

 ElemType count;

    BTreeNode *left;

    BTreeNode *right;

};

void InitBSTree(BTreeNode *&bst)           //初始化二叉搜索树

{

 bst=NULL;

 

}

void PrintBSTree(BTreeNode *bst)           //以广义表形式输出二叉搜索树

{

 if(bst!=NULL){

  cout<<bst->data;

  cout<<'['<<bst->count<<']';

  if(bst->left!=NULL||bst->right!=NULL){

   cout<<'(';

   PrintBSTree(bst->left);   

   if(bst->right!=NULL)

    cout<<',';

   PrintBSTree(bst->right);

   cout<<')';

  }

 }

}

void Insert (BTreeNode *&bst, ElemType item)

{

 BTreeNode*t=bst,*parent=NULL;

 while(t!=NULL){

  parent=t;

  if(item<t->data) t=t->left;  

  else if(item>t->data) t=t->right;

  else{

   t->count++;

   break;

  }

 }

 if((t==NULL)||item!=parent->data){

  BTreeNode*p=new BTreeNode;

     p->data=item;

     p->count=1;

     p->left=p->right=NULL;

     if(parent==NULL) bst=p;

     else if(item<parent->data) parent->left=p;

     else parent->right=p;

 }

}

void CreateBSTree(BTreeNode *&bst, ElemType a[], int n)       //建立二叉搜索树(用非递归算法实现)

{

 bst=NULL; 

 for(int i=0;i<n;i++)  

  Insert(bst,a[i]); 

}

bool Delete (BTreeNode *&bst , ElemType item)

{

 BTreeNode *t=bst,*parent=NULL,*m,*n; 

 while((t!=NULL)&&(t->data!=item)){

  if(item==t->data) break;      

  else{

   if(item<t->data){

    parent=t;

    t=t->left;

   }

   else{

    parent=t;

    t=t->right;

   }

  }

 }

 if(t->count>1){

  t->count--;

  return true;  

 }

 else if(t==NULL){

  cout<<"没有找到待删除结点!"<<endl;

  return false;

 }

    else{

  if((t->left==NULL)&&(t->right==NULL)){

   if(t==bst)

    bst=NULL;

   else{

    if(t==parent->left)

     parent->left=NULL;

    else

     parent->right=NULL;

   }

  }

  else if((t->left==NULL)||(t->right==NULL)){

   if(t==bst){

    if(t->left==NULL)                                 

                   bst=t->right;                                  

                  else

                   bst=t->left;

   }

   else{

    if((t==parent->left)&&(t->left!=NULL))

     parent->left=t->left;                        

                else if((t==parent->left)&&(t->right!=NULL))       

                    parent->left=t->right;

    else if((t==parent->right)&&(t->left!=NULL))       

                    parent->right=t->left;                    

                else if((t==parent->right)&&(t->right!=NULL))      

                    parent->right=t->right;

   }

  }

  else{

   if((t->left!=NULL)&&(t->right!=NULL)){

    m=t;

                n=t->left;                                 

                while(n->right!=NULL){

     m=n;

                    n=n->right;

                }

                t->data=n->data;                            

                if(m==t)

     t->left=n->left;

                else

                    m->right=n->left;

                t=n;

   }

  }

    free(t);

 return true;

 }

}

ElemType MaxBSTree(BTreeNode *bst)           //求二叉搜索树的最大结点值(用非递归算法实现)

{

 ElemType max;

    if(bst==NULL){

  cout<<"该二叉搜索树为空!"<<endl;

        exit(1);

 }

 max=bst->data;

    while(bst!=NULL){

  if(max<bst->data)

   max=bst->data;

  bst=bst->right;

 }

 return max;

}

你试试吧,应该对的,选我做答案哈~

二叉搜索树的基本操作二.实验内容设在一棵二叉搜索树的每个结点的data域中,含有关键字key域和统计相同关键字元素个数的count域.当向该树插入一个元素时,若树中已有相同关键字值的结点, 二叉树性质3,二叉树的基本性质 二叉树具有以下几个性质:性质1:在二叉树的第k层上,最多有2k-1(k≥1)个结点; 性质2:深度为m的二叉树最多有2m-1个结点; 性质3:在任意一棵二叉树中,度 初三化学实验的基本操作. 杞人忧天-打一化学实验的基本操作 已知一组元素为怎么构造二叉搜索树已知一组元素(46,25,78,62,12,37,70,29),画出按元素排列顺序输入生成的一棵二叉树. 杞人忧天(打一化学实验基本操作) 数据结构课程设计!算术表达式与二叉树!【问题描述】一个表达式和一棵二叉树之间,存在着自然的对应关系.写一个程序,实现基于二叉树表示的算术表达式的操作.知识点:二叉树,表达式树, 光谱纯二氧化钛的制备 实验方法有几种 实验内容与操作步骤 钳工的 基本操作内容是什么 怎样掌握化学实验的基本操作 喷泉实验的基本操作原理 用栈的知识和算符优先法对算术表达式求值一、实验目的:熟练掌握栈的基本操作,进一步理解栈的应用.二、实验内容:设计一个程序,用算符优先法对算术表达式求值.三、基本要求:以字符 数据结构完全二叉树问题一棵完全二叉树的第9层有200个叶结点,则该完全二叉树最多有【】个结点 有关二叉搜索树,求解题思路.一棵二叉树或者是空的,或者包括一个结点,后面连接着两棵子树.这两棵子树分别称为左子树和右子树.每个结点上都标有一个英文小写字母.若一个结点不是任何一 2 杞人忧天 (打一化学基本实验操作) 杞人忧天-打一化学实验基本操作a 已知一棵二叉树的前序为abcdeqgtij,中序为cbedatgijq,该二叉树的层次是多少? 一棵二叉树有10个度为1的结点,7个度为二的结点,则该二叉树共有()个结点?什么叫“度”?