问题及代码:

[cpp] view plaincopy
  1. /*
  2. Copyright (c)2016,烟台大学计算机与控制工程学院
  3. All rights reserved.
  4. 文件名称:查找.cpp
  5. 作    者:   陈朋
  6. 完成日期:2016年12月15日
  7. 版 本 号:v1.0
  8. 问题描述:
  9. 输入描述:无
  10. 程序输出:若干
  11. */
  12. #include <stdio.h>
  13. #include <malloc.h>
  14. typedef int KeyType;
  15. typedef char InfoType[10];
  16. typedef struct node                 //记录类型
  17. {
  18. KeyType key;                    //关键字项
  19. InfoType data;                  //其他数据域
  20. struct node *lchild,*rchild;    //左右孩子指针
  21. } BSTNode;
  22. //在p所指向的二叉排序树中,插入值为k的节点
  23. int InsertBST(BSTNode *&p,KeyType k)
  24. {
  25. if (p==NULL)                        //原树为空, 新插入的记录为根结点
  26. {
  27. p=(BSTNode *)malloc(sizeof(BSTNode));
  28. p->key=k;
  29. p->lchild=p->rchild=NULL;
  30. return 1;
  31. }
  32. else if (k==p->key)                 //树中存在相同关键字的结点,返回0
  33. return 0;
  34. else if (k<p->key)
  35. return InsertBST(p->lchild,k);  //插入到*p的左子树中
  36. else
  37. return InsertBST(p->rchild,k);  //插入到*p的右子树中
  38. }
  39. //由有n个元素的数组A,创建一个二叉排序树
  40. BSTNode *CreateBST(KeyType A[],int n)   //返回BST树根结点指针
  41. {
  42. BSTNode *bt=NULL;                   //初始时bt为空树
  43. int i=0;
  44. while (i<n)
  45. {
  46. InsertBST(bt,A[i]);             //将关键字A[i]插入二叉排序树T中
  47. i++;
  48. }
  49. return bt;                          //返回建立的二叉排序树的根指针
  50. }
  51. //输出一棵排序二叉树
  52. void DispBST(BSTNode *bt)
  53. {
  54. if (bt!=NULL)
  55. {
  56. printf("%d",bt->key);
  57. if (bt->lchild!=NULL || bt->rchild!=NULL)
  58. {
  59. printf("(");                        //有孩子结点时才输出(
  60. DispBST(bt->lchild);                //递归处理左子树
  61. if (bt->rchild!=NULL) printf(",");  //有右孩子结点时才输出,
  62. DispBST(bt->rchild);                //递归处理右子树
  63. printf(")");                        //有孩子结点时才输出)
  64. }
  65. }
  66. }
  67. //在bt指向的节点为根的排序二叉树中,查找值为k的节点。找不到返回NULL
  68. BSTNode *SearchBST(BSTNode *bt,KeyType k)
  69. {
  70. if (bt==NULL || bt->key==k)         //递归终结条件
  71. return bt;
  72. if (k<bt->key)
  73. return SearchBST(bt->lchild,k);  //在左子树中递归查找
  74. else
  75. return SearchBST(bt->rchild,k);  //在右子树中递归查找
  76. }
  77. //二叉排序树中查找的非递归算法
  78. BSTNode *SearchBST1(BSTNode *bt,KeyType k)
  79. {
  80. while (bt!=NULL)
  81. {
  82. if (k==bt->key)
  83. return bt;
  84. else if (k<bt->key)
  85. bt=bt->lchild;
  86. else
  87. bt=bt->rchild;
  88. }
  89. return NULL;
  90. }
  91. void Delete1(BSTNode *p,BSTNode *&r)  //当被删*p结点有左右子树时的删除过程
  92. {
  93. BSTNode *q;
  94. if (r->rchild!=NULL)
  95. Delete1(p,r->rchild);   //递归找最右下结点
  96. else                        //找到了最右下结点*r
  97. {
  98. p->key=r->key;          //将*r的关键字值赋给*p
  99. q=r;
  100. r=r->lchild;            //直接将其左子树的根结点放在被删结点的位置上
  101. free(q);                //释放原*r的空间
  102. }
  103. }
  104. void Delete(BSTNode *&p)   //从二叉排序树中删除*p结点
  105. {
  106. BSTNode *q;
  107. if (p->rchild==NULL)        //*p结点没有右子树的情况
  108. {
  109. q=p;
  110. p=p->lchild;            //直接将其右子树的根结点放在被删结点的位置上
  111. free(q);
  112. }
  113. else if (p->lchild==NULL)   //*p结点没有左子树的情况
  114. {
  115. q=p;
  116. p=p->rchild;            //将*p结点的右子树作为双亲结点的相应子树
  117. free(q);
  118. }
  119. else Delete1(p,p->lchild);  //*p结点既没有左子树又没有右子树的情况
  120. }
  121. int DeleteBST(BSTNode *&bt, KeyType k)  //在bt中删除关键字为k的结点
  122. {
  123. if (bt==NULL)
  124. return 0;               //空树删除失败
  125. else
  126. {
  127. if (k<bt->key)
  128. return DeleteBST(bt->lchild,k); //递归在左子树中删除为k的结点
  129. else if (k>bt->key)
  130. return DeleteBST(bt->rchild,k); //递归在右子树中删除为k的结点
  131. else
  132. {
  133. Delete(bt);     //调用Delete(bt)函数删除*bt结点
  134. return 1;
  135. }
  136. }
  137. }
  138. int main()
  139. {
  140. BSTNode *bt;
  141. int n=12,x=46;
  142. KeyType a[]= {25,18,46,2,53,39,32,4,74,67,60,11};
  143. bt=CreateBST(a,n);
  144. printf("BST:");
  145. DispBST(bt);
  146. printf("\n");
  147. printf("删除%d结点\n",x);
  148. if (SearchBST(bt,x)!=NULL)
  149. {
  150. DeleteBST(bt,x);
  151. printf("BST:");
  152. DispBST(bt);
  153. printf("\n");
  154. }
  155. return 0;
  156. }

第十四周 项目一 二叉排序树相关推荐

  1. 第十四周项目一 之【二叉排序树】

    /*问题及代码 *Copyright(c)2016,烟台大学计算机学院 *All right reserved. *文件名称:验证算法.cpp *作者:李潇*时间:12月8日 *版本号:v1.0 *问 ...

  2. 第二十四周项目4-猴子选大王(约瑟夫问题)

    一群猴子,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈.从第1只开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王.输入m和n, ...

  3. 项目class第十四周项目一:动物学叫

    在改章节中,我们主要介绍项目class的内容,自我感觉有个不错的建议和大家分享下 /* * Copyright (c) 2013, 烟台大学计算机学院 * All rights reserved. * ...

  4. 第十四周 项目2 - 用哈希法组织关键字

    /* * Copyright (c)2017,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:项目2.cbp * 作 者:孙仁圆 * 完成日期:2017年12 ...

  5. 第十四周 项目1 - 验证算法

    /* * Copyright (c)2017,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:项目1.cbp * 作 者:孙仁圆 * 完成日期:2017年12 ...

  6. 第十四周项目5—平衡二叉树 包括二叉树的删除和插入

    //头文件 #ifndef GRAPH_H_INCLUDED #define GRAPH_H_INCLUDED #define MAXV 100 //最大顶点个数 #define INF 32767 ...

  7. 第十四周 项目一(4) 平衡二叉树

    /* *Copyright (c) 2016,烟台大学计算机学院 *All rights reserved. *文件名称:graph.cpp *作者:衣龙川 *完成日期:2016年12月8日 *版本号 ...

  8. 第十四周项目四——矩阵运算(2)矩阵相乘

    问题及代码 一个n行m列的矩阵可以乘以一个m行p列的矩阵,得到的结果是一个n行p列的矩阵,其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应相乘后所有m个乘积的 ...

  9. 第十四周项目2-带姓名的成绩单

    设score[8]数组中存储8名同学的C++成绩,增加一个数组string name[8]并赋初值,表示同学们的姓名.这两个数组中,每名同学的姓名与成绩的下标要始终保持一致. (1)输出按成绩排序后的 ...

  10. 第十四周项目三-数组类模板

    /* *Copyright(c)2016,烟台大学计算机与控制工程学院 *All rights reserved *文件名称:123.cpp *作 者:王蕊 *完成日期:2016年6月2日 *版 本 ...

最新文章

  1. 排序算法一:选择排序
  2. POJ1564 Sum It Up(DFS)
  3. Stanford UFLDL教程 稀疏自编码器符号一览表
  4. 神策数据面向互联网金融企业提供行业解决方案
  5. MongoDB的快速手动安装
  6. 会动的图解 | 既然IP层会分片,为什么TCP层也还要分段?
  7. 车牌识别及验证码识别的一般思路
  8. Cocos2d-x之绘不规则多边形
  9. http://www.2cto.com/ 红黑联盟
  10. 为什么uzi排到古手羽就秒_Uzi排到古手羽秒退,网友争相发表看法,直播间弹幕疑似给出答案...
  11. 阴阳师服务器维护6,《阴阳师》手游6月24日维护更新公告
  12. JAVA公司网站系统毕业设计 开题报告
  13. 电脑重启很久一直在转_电脑重启后鼠标一直在转圈怎么办
  14. Python 数字筛选
  15. 发言稿开场白范文_演讲稿开场白范文集锦
  16. cocos2d 高仿doodle jump 无源码
  17. 云原生Web服务框架ESA Restlight
  18. 加一问题中的灵光一闪
  19. Linux备份与恢复
  20. ie6 ie7下,Li不能自动换行,出现竖排文字现象(PS:li不固定宽度,所有li同一行显示),在ie8却可以...

热门文章

  1. 腐蚀rust电脑分辨率调多少_腐蚀Rust帧数优化指南 游戏FPS提高方法说明
  2. 板材品牌之生态板吊顶好还是桑拿板好
  3. easy excel 设置某一列的格式
  4. 阿里新供应链架构解读
  5. 南开大学2017年数学分析高等代数考研试题
  6. 如何把手机证件照压缩到15KB?手机压缩图片方法
  7. 图像分割算法的优缺点比较
  8. IE浏览器兼容性问题!(按alt+x+b不弹出兼容性窗口)
  9. trajan 算法 离线求lca
  10. 充电速度公式_锂电充电时间计算公式