第十三周 【项目1 - 验证算法之二叉排序树】
/*
*Copyright (c)2017,烟台大学计算机与控制工程学院
*All rights reservrd.
*作者:赵楷文
*完成时间:2017年11月26日
*版本号:v1.0
*问题描述:通过以下几种方式验证二叉排序树
(1)由整数序列{43,52,75,24,10,38,67,55,63,60}构造二叉排序树;
(2)输出用括号法表示的二叉排序树;
(3)用递归算法和非递归算法查找关键字55;
(4)分别删除43和55,输出删除后用括号法表示的二叉排序树。
#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) //树中存在相同关键字的结点,返回0return 0;else if (k<p->key)return InsertBST(p->lchild,k); //插入到*p的左子树中elsereturn 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); //在左子树中递归查找elsereturn 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;elsebt=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的关键字值赋给*pq=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;}
程序测试:
第十三周 【项目1 - 验证算法之二叉排序树】相关推荐
- 数据结构上机实践第14周项目1 - 验证算法(折半查找)
验证算法(折半查找) 项目要求如下: 请用有序表{12,18,24,35,47,50,62,83,90,115,134}作为测试序列,分别对查找90.47.100进行测试. 实现源代码如下: //*C ...
- 第14周项目1——验证算法(平衡二叉树)
问题及代码: /* *Copyright(c++)2015,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:CPP1.cpp *作者:宋 晨 *完成日期:2015 ...
- 第十三周项目一(4)——验证平衡二叉树相关算法
*Copyright(c)2017,烟台大学计算机与控制工程学院 *All rights reservrd. *作者:刘文平 *完成时间:2017年11月23日 *版本号:v1.0 *问题描述:验证平 ...
- 第十三周项目4-数组的排序:冒泡排序
编写函数,完成冒泡排序,要求不能改变下面的main函数. //两个函数bubble_sort和output_array的声明int main( ) {int a[20]={86,76,62,58,77 ...
- 第十三周项目四-立体类族共有的抽象类
/* *Copyright(c)2016,烟台大学计算机与控制工程学院 *All rights reserved *文件名称:123.cpp *作 者:王蕊 *完成日期:2016年6月1日 *版 本 ...
- 第十三周项目三-形状类族中的纯虚函数
/* *Copyright(c)2016,烟台大学计算机与控制工程学院 *All rights reserved *文件名称:123.cpp *作 者:王蕊 *完成日期:2016年6月1日 *版 本 ...
- 第十三周项目二-动物这样叫(3)
/* *Copyright(c)2016,烟台大学计算机与控制工程学院 *All rights reserved *文件名称:123.cpp *作 者:王蕊 *完成日期:2016年5月31日 *版 本 ...
- 第十三周项目二-动物这样叫(2)
/* *Copyright(c)2016,烟台大学计算机与控制工程学院 *All rights reserved *文件名称:123.cpp *作 者:王蕊 *完成日期:2016年5月31日 *版 本 ...
- 第十三周项目二-动物这样叫(1)
/* *Copyright(c)2016,烟台大学计算机与控制工程学院 *All rights reserved *文件名称:123.cpp *作 者:王蕊 *完成日期:2016年5月31日 *版 本 ...
最新文章
- dedecms发布文章提示标题不能为空怎么办
- 重新定义Wi-Fi功能,Wi-Fi 6为什么要分两步?
- 多线程编程实践——实现生产者、消费者模型
- python安装教程windows-PyCharm 安装教程(Windows)
- 程序员,Mybatis 你踩过坑吗?
- 【水滴石穿】react-native-book
- 几维安全Javascript代码混淆(js加密)在线使用说明
- python找出矩阵中的最大值_Python / Scipy:找到矩阵的“有界”最小值/最大值
- Oracle exp/imp导出导入命令及数据库备份
- 堆-动态的排序(洛谷1801-黑匣子)
- 图像增强︱window7+opencv3.2+keras/theano简单应用(函数解读)
- Quartz.Net定时任务简单实用(实例)
- STm32驱动74HC595引脚图时序图工作原理
- 卫星电话是直接与卫星通信还是通过地面站?
- 独创圆柱形投影,索尼高透光HOE全息显示方案详解
- 不积跬步无以至千里,不积小流无以成江海
- Oracle数据库的锁类型
- 关于 Burrows-Wheeler 变换和 Lempel-Ziv 解析的一些认识
- Webx系列之文件下载
- frame切换、多窗口切换
热门文章
- 让数据分析效率再提升50%,帆软FineBI V6.0版本最新剧透!
- well-known file is not secure
- mysql中存储gis数据结构_GIS空间数据库的设计
- 【数据库】数据库设计
- 公有云与私有云的区别
- 11【C语言 趣味算法】个人所得税问题(结构体应用):结构体的声明、定义结构体类型的三种方法等
- Web前端技术学习路线图 初阶+中阶+高阶
- 罗马数字转换(Java字符串练习)
- Maven构建项目时,使用指定的WebContent目录
- 煤炭及煤化工加工会产生什么危废_煤化工危废处置难在哪