第十四周 项目一 二叉排序树
问题及代码:
- /*
- Copyright (c)2016,烟台大学计算机与控制工程学院
- All rights reserved.
- 文件名称:查找.cpp
- 作 者: 陈朋
- 完成日期:2016年12月15日
- 版 本 号:v1.0
- 问题描述:
- 输入描述:无
- 程序输出:若干
- */
- #include <stdio.h>
- #include <malloc.h>
- typedef int KeyType;
- typedef char InfoType[10];
- typedef struct node //记录类型
- {
- KeyType key; //关键字项
- InfoType data; //其他数据域
- struct node *lchild,*rchild; //左右孩子指针
- } BSTNode;
- //在p所指向的二叉排序树中,插入值为k的节点
- int InsertBST(BSTNode *&p,KeyType k)
- {
- if (p==NULL) //原树为空, 新插入的记录为根结点
- {
- p=(BSTNode *)malloc(sizeof(BSTNode));
- p->key=k;
- p->lchild=p->rchild=NULL;
- return 1;
- }
- else if (k==p->key) //树中存在相同关键字的结点,返回0
- return 0;
- else if (k<p->key)
- return InsertBST(p->lchild,k); //插入到*p的左子树中
- else
- return InsertBST(p->rchild,k); //插入到*p的右子树中
- }
- //由有n个元素的数组A,创建一个二叉排序树
- BSTNode *CreateBST(KeyType A[],int n) //返回BST树根结点指针
- {
- BSTNode *bt=NULL; //初始时bt为空树
- int i=0;
- while (i<n)
- {
- InsertBST(bt,A[i]); //将关键字A[i]插入二叉排序树T中
- i++;
- }
- return bt; //返回建立的二叉排序树的根指针
- }
- //输出一棵排序二叉树
- void DispBST(BSTNode *bt)
- {
- if (bt!=NULL)
- {
- printf("%d",bt->key);
- if (bt->lchild!=NULL || bt->rchild!=NULL)
- {
- printf("("); //有孩子结点时才输出(
- DispBST(bt->lchild); //递归处理左子树
- if (bt->rchild!=NULL) printf(","); //有右孩子结点时才输出,
- DispBST(bt->rchild); //递归处理右子树
- printf(")"); //有孩子结点时才输出)
- }
- }
- }
- //在bt指向的节点为根的排序二叉树中,查找值为k的节点。找不到返回NULL
- BSTNode *SearchBST(BSTNode *bt,KeyType k)
- {
- if (bt==NULL || bt->key==k) //递归终结条件
- return bt;
- if (k<bt->key)
- return SearchBST(bt->lchild,k); //在左子树中递归查找
- else
- return SearchBST(bt->rchild,k); //在右子树中递归查找
- }
- //二叉排序树中查找的非递归算法
- BSTNode *SearchBST1(BSTNode *bt,KeyType k)
- {
- while (bt!=NULL)
- {
- if (k==bt->key)
- return bt;
- else if (k<bt->key)
- bt=bt->lchild;
- else
- bt=bt->rchild;
- }
- return NULL;
- }
- void Delete1(BSTNode *p,BSTNode *&r) //当被删*p结点有左右子树时的删除过程
- {
- BSTNode *q;
- if (r->rchild!=NULL)
- Delete1(p,r->rchild); //递归找最右下结点
- else //找到了最右下结点*r
- {
- p->key=r->key; //将*r的关键字值赋给*p
- q=r;
- r=r->lchild; //直接将其左子树的根结点放在被删结点的位置上
- free(q); //释放原*r的空间
- }
- }
- void Delete(BSTNode *&p) //从二叉排序树中删除*p结点
- {
- BSTNode *q;
- if (p->rchild==NULL) //*p结点没有右子树的情况
- {
- q=p;
- p=p->lchild; //直接将其右子树的根结点放在被删结点的位置上
- free(q);
- }
- else if (p->lchild==NULL) //*p结点没有左子树的情况
- {
- q=p;
- p=p->rchild; //将*p结点的右子树作为双亲结点的相应子树
- free(q);
- }
- else Delete1(p,p->lchild); //*p结点既没有左子树又没有右子树的情况
- }
- int DeleteBST(BSTNode *&bt, KeyType k) //在bt中删除关键字为k的结点
- {
- if (bt==NULL)
- return 0; //空树删除失败
- else
- {
- if (k<bt->key)
- return DeleteBST(bt->lchild,k); //递归在左子树中删除为k的结点
- else if (k>bt->key)
- return DeleteBST(bt->rchild,k); //递归在右子树中删除为k的结点
- else
- {
- Delete(bt); //调用Delete(bt)函数删除*bt结点
- return 1;
- }
- }
- }
- int main()
- {
- BSTNode *bt;
- int n=12,x=46;
- KeyType a[]= {25,18,46,2,53,39,32,4,74,67,60,11};
- bt=CreateBST(a,n);
- printf("BST:");
- DispBST(bt);
- printf("\n");
- printf("删除%d结点\n",x);
- if (SearchBST(bt,x)!=NULL)
- {
- DeleteBST(bt,x);
- printf("BST:");
- DispBST(bt);
- printf("\n");
- }
- return 0;
- }
第十四周 项目一 二叉排序树相关推荐
- 第十四周项目一 之【二叉排序树】
/*问题及代码 *Copyright(c)2016,烟台大学计算机学院 *All right reserved. *文件名称:验证算法.cpp *作者:李潇*时间:12月8日 *版本号:v1.0 *问 ...
- 第二十四周项目4-猴子选大王(约瑟夫问题)
一群猴子,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈.从第1只开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王.输入m和n, ...
- 项目class第十四周项目一:动物学叫
在改章节中,我们主要介绍项目class的内容,自我感觉有个不错的建议和大家分享下 /* * Copyright (c) 2013, 烟台大学计算机学院 * All rights reserved. * ...
- 第十四周 项目2 - 用哈希法组织关键字
/* * Copyright (c)2017,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:项目2.cbp * 作 者:孙仁圆 * 完成日期:2017年12 ...
- 第十四周 项目1 - 验证算法
/* * Copyright (c)2017,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:项目1.cbp * 作 者:孙仁圆 * 完成日期:2017年12 ...
- 第十四周项目5—平衡二叉树 包括二叉树的删除和插入
//头文件 #ifndef GRAPH_H_INCLUDED #define GRAPH_H_INCLUDED #define MAXV 100 //最大顶点个数 #define INF 32767 ...
- 第十四周 项目一(4) 平衡二叉树
/* *Copyright (c) 2016,烟台大学计算机学院 *All rights reserved. *文件名称:graph.cpp *作者:衣龙川 *完成日期:2016年12月8日 *版本号 ...
- 第十四周项目四——矩阵运算(2)矩阵相乘
问题及代码 一个n行m列的矩阵可以乘以一个m行p列的矩阵,得到的结果是一个n行p列的矩阵,其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应相乘后所有m个乘积的 ...
- 第十四周项目2-带姓名的成绩单
设score[8]数组中存储8名同学的C++成绩,增加一个数组string name[8]并赋初值,表示同学们的姓名.这两个数组中,每名同学的姓名与成绩的下标要始终保持一致. (1)输出按成绩排序后的 ...
- 第十四周项目三-数组类模板
/* *Copyright(c)2016,烟台大学计算机与控制工程学院 *All rights reserved *文件名称:123.cpp *作 者:王蕊 *完成日期:2016年6月2日 *版 本 ...
最新文章
- 排序算法一:选择排序
- POJ1564 Sum It Up(DFS)
- Stanford UFLDL教程 稀疏自编码器符号一览表
- 神策数据面向互联网金融企业提供行业解决方案
- MongoDB的快速手动安装
- 会动的图解 | 既然IP层会分片,为什么TCP层也还要分段?
- 车牌识别及验证码识别的一般思路
- Cocos2d-x之绘不规则多边形
- http://www.2cto.com/ 红黑联盟
- 为什么uzi排到古手羽就秒_Uzi排到古手羽秒退,网友争相发表看法,直播间弹幕疑似给出答案...
- 阴阳师服务器维护6,《阴阳师》手游6月24日维护更新公告
- JAVA公司网站系统毕业设计 开题报告
- 电脑重启很久一直在转_电脑重启后鼠标一直在转圈怎么办
- Python 数字筛选
- 发言稿开场白范文_演讲稿开场白范文集锦
- cocos2d 高仿doodle jump 无源码
- 云原生Web服务框架ESA Restlight
- 加一问题中的灵光一闪
- Linux备份与恢复
- ie6 ie7下,Li不能自动换行,出现竖排文字现象(PS:li不固定宽度,所有li同一行显示),在ie8却可以...