数据结构实验十四 二叉排序树

简介: 数据结构实验十四 二叉排序树

一、实验目的

  1. 掌握在数组上进行各种查找的方法和算法。
  2. 深刻理解各种方法的特点,并能灵活运用。
  3. 加深对查找的理解,逐步培养解决实际问题的能力。

二、实验要求

//算法7.4 二叉排序树的递归查找

//算法7.5 二叉排序树的插入

//算法7.6 二叉排序树的创建

//算法 7.7 二叉排序树的删除

1. #include<iostream>
2. using namespace std;
3. #define ENDFLAG '#'
4. //char a[10]={'5','6','7','2','1','9','8','10','3','4','#'};//全局变量
5. typedef struct ElemType{ 
6.  char key;
7. }ElemType;
8. 
9. typedef struct BSTNode{
10.   ElemType data;  //结点数据域
11.   BSTNode *lchild,*rchild;  //左右孩子指针
12. }BSTNode,*BSTree;
13. 
14. 
15. //算法7.4 二叉排序树的递归查找
16. BSTree SearchBST(BSTree T,char key) {
17. //在根指针T所指二叉排序树中递归地查找某关键字等于key的数据元素
18. //若查找成功,则返回指向该数据元素结点的指针,否则返回空指针
19. if((!T)||key==T->data.key) return T;                    //查找结束
20.   else if(key<T->data.key)  return SearchBST(T->lchild,key);        //在左子树中继续查找
21. else return SearchBST(T->rchild,key);           //在右子树中继续查找
22. } // SearchBST
23. 
24. 
25. 
26. //算法7.5 二叉排序树的插入
27. void InsertBST(BSTree &T,ElemType e ) {
28. //当二叉排序树T中不存在关键字等于e.key的数据元素时,则插入该元素
29. if(!T) {                        //找到插入位置,递归结束
30.      BSTree S = new BSTNode;                //生成新结点*S
31.          S->data = e;                     //新结点*S的数据域置为e   
32.          S->lchild = S->rchild = NULL;  //新结点*S作为叶子结点
33.          T =S;                    //把新结点*S链接到已找到的插入位置
34.   }
35. else if (e.key< T->data.key) 
36.       InsertBST(T->lchild, e );     //将*S插入左子树
37. else if (e.key> T->data.key) 
38.       InsertBST(T->rchild, e);      //将*S插入右子树
39. }// InsertBST
40. 
41. 
42. 
43. //算法7.6 二叉排序树的创建
44. void CreateBST(BSTree &T ) {
45. //依次读入一个关键字为key的结点,将此结点插入二叉排序树T中
46.   T=NULL;
47.   ElemType e;
48.   cin>>e.key;        //???
49.   while(e.key!=ENDFLAG){    //ENDFLAG为自定义常量,作为输入结束标志
50.     InsertBST(T, e);            //将此结点插入二叉排序树T中
51.     cin>>e.key;     //???
52.   }//while            
53. }//CreatBST
54. 
55. void DeleteBST(BSTree &T,char key) {
56. //从二叉排序树T中删除关键字等于key的结点
57.   BSTree p=T;BSTree f=NULL;                           //初始化
58.   BSTree q;
59.   BSTree s;
60. /*------------下面的while循环从根开始查找关键字等于key的结点*p-------------*/
61.   while(p){                  
62. if (p->data.key == key) break;            //找到关键字等于key的结点*p,结束循环
63.    f=p;                                     //*f为*p的双亲结点
64. if (p->data.key> key)  p=p->lchild;       //在*p的左子树中继续查找
65. else p=p->rchild;                         //在*p的右子树中继续查找
66.   }//while
67. if(!p) return;                            //找不到被删结点则返回
68. /*―考虑三种情况实现p所指子树内部的处理:*p左右子树均不空、无右子树、无左子树―*/
69. if ((p->lchild)&& (p->rchild)) {        //被删结点*p左右子树均不空
70.      q = p;
71.    s = p->lchild;
72.      while (s->rchild)                      //在*p的左子树中继续查找其前驱结点,即最右下结点
73.        {q = s; s = s->rchild;}              //向右到尽头
74.      p->data = s->data;                     //s指向被删结点的"前驱"
75. if(q!=p){
76.      q->rchild = s->lchild;       //重接*q的右子树
77.    }
78. else q->lchild = s->lchild;           //重接*q的左子树
79. delete s;
80.   }//if
81. else{
82.   if(!p->rchild) {                  //被删结点*p无右子树,只需重接其左子树
83.       q = p; p = p->lchild; 
84.     }//else if
85.   else if(!p->lchild) {                   //被删结点*p无左子树,只需重接其右子树
86.      q = p; p = p->rchild;
87.     }//else if
88.   /*――――――――――将p所指的子树挂接到其双亲结点*f相应的位置――――――――*/
89.     if(!f) T=p;                             //被删结点为根结点
90.     else if (q==f->lchild) f->lchild = p;     //挂接到*f的左子树位置
91.     else f->rchild = p;                     //挂接到*f的右子树位置
92.     delete q;
93.   }
94. }//DeleteBST
95. 
96. //算法 7.7 二叉排序树的删除
97. 
98. //中序遍历
99. void InOrderTraverse(BSTree T)
100. { 
101.  if(T)
102.  {
103.    InOrderTraverse(T->lchild);
104.    cout<<T->data.key;
105.    InOrderTraverse(T->rchild);
106.    }    
107. }
108. 
109. int  main()
110. {
111.  BSTree T;
112.  cout<<"请输入若干字符,用回车区分,以#结束输入"<<endl;
113.  CreateBST(T);
114.  cout<<"当前有序二叉树中序遍历结果为"<<endl;
115.  InOrderTraverse(T);
116.  char key;//待查找或待删除内容
117.  cout<<"请输入待查找字符"<<endl;
118.  cin>>key;
119.  BSTree result=SearchBST(T,key);
120.  if(result)
121.  {cout<<"找到字符"<<key<<endl;}
122.  else
123.  {cout<<"未找到"<<key<<endl;}
124.  cout<<"请输入待删除的字符"<<endl;
125.  cin>>key;
126.  DeleteBST(T,key);
127.  cout<<"当前有序二叉树中序遍历结果为"<<endl;
128.  InOrderTraverse(T);
129.  return 0; 
130. }
目录
相关文章
|
2月前
|
存储 算法 编译器
数据结构实验之矩阵的运算器(二维数组)
本实验旨在通过团队合作,掌握数组和矩阵相关运算的代码实现,包括矩阵的加减、数乘、转置、乘法、n次方及行列式的计算。实验过程中,成员们需分工协作,解决编程难题,最终实现一个功能完备的矩阵计算器。通过本实验,不仅锻炼了编程能力,还加深了对数学概念的理解,同时培养了团队合作精神。
75 4
|
2月前
数据结构实验之串模式匹配问题
本实验旨在掌握串模式匹配技术,通过创建文本文件、实现单词计数与定位功能,最终构建一个包含文件建立、单词统计与定位、程序退出等选项的主菜单,以增强对字符串处理的理解与应用能力。
68 4
|
2月前
|
算法
数据结构实验之最长公共子序列
本实验旨在通过编程实践帮助学生理解串的基本概念及求解最长公共子序列的算法。实验内容包括使用动态规划方法设计并实现算法,以找出给定两序列的最大公共子序列。示例代码展示了如何通过构建状态矩阵和回溯路径来找到解决方案。实验总结指出,`memset()`函数用于内存初始化,且对于特定输入,程序能正确输出最长公共子序列之一。
64 4
|
2月前
|
算法
数据结构实验之操作系统打印机管理器问题
本实验旨在通过实现操作系统中的打印机管理器问题,掌握队列的基本操作如入队、出队等,利用队列的先进先出特性解决先申请先打印的问题。实验包括队列的初始化、入队、出队、打印队列内容等功能,并通过菜单式界面进行交互。实验结果显示基本功能可正常执行,但在连续操作时存在执行失败的情况,需进一步优化。
54 4
|
2月前
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
67 4
|
5天前
|
算法 C++
【C++数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】
【数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】 目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:实现二叉排序树的基本算法。 相关知识 为了完成本关任务,你需要掌握:二叉树的创建、查找和删除算法。具体如下: (1)由关键字序列(4,9,0,1,8,6,3,5,2,7)创建一棵二叉排序树bt并以括号表示法输出。 (2)判断bt是否为一棵二叉排序树。 (3)采用递归方法查找关键字为6的结点,并输出其查找路径。 (4)分别删除bt中关键
32 11
【C++数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】
|
2月前
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
108 4
|
2月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
66 4
|
3月前
|
存储 算法 数据管理
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
这篇文章通过需求分析、代码实现和测试验证,详细介绍了二叉排序树的创建、遍历和删除操作,以及二叉平衡树(AVL)的自平衡特性和单旋转操作,旨在提高树结构在数据管理中的效率和性能。
68 0
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
|
7月前
|
存储 算法 数据挖掘
数据结构实验||约瑟夫环
数据结构实验||约瑟夫环