/*

*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 - 验证算法之二叉排序树】相关推荐

  1. 数据结构上机实践第14周项目1 - 验证算法(折半查找)

    验证算法(折半查找) 项目要求如下: 请用有序表{12,18,24,35,47,50,62,83,90,115,134}作为测试序列,分别对查找90.47.100进行测试. 实现源代码如下: //*C ...

  2. 第14周项目1——验证算法(平衡二叉树)

    问题及代码: /* *Copyright(c++)2015,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:CPP1.cpp *作者:宋 晨 *完成日期:2015 ...

  3. 第十三周项目一(4)——验证平衡二叉树相关算法

    *Copyright(c)2017,烟台大学计算机与控制工程学院 *All rights reservrd. *作者:刘文平 *完成时间:2017年11月23日 *版本号:v1.0 *问题描述:验证平 ...

  4. 第十三周项目4-数组的排序:冒泡排序

    编写函数,完成冒泡排序,要求不能改变下面的main函数. //两个函数bubble_sort和output_array的声明int main( ) {int a[20]={86,76,62,58,77 ...

  5. 第十三周项目四-立体类族共有的抽象类

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

  6. 第十三周项目三-形状类族中的纯虚函数

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

  7. 第十三周项目二-动物这样叫(3)

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

  8. 第十三周项目二-动物这样叫(2)

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

  9. 第十三周项目二-动物这样叫(1)

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

最新文章

  1. dedecms发布文章提示标题不能为空怎么办
  2. 重新定义Wi-Fi功能,Wi-Fi 6为什么要分两步?
  3. 多线程编程实践——实现生产者、消费者模型
  4. python安装教程windows-PyCharm 安装教程(Windows)
  5. 程序员,Mybatis 你踩过坑吗?
  6. 【水滴石穿】react-native-book
  7. 几维安全Javascript代码混淆(js加密)在线使用说明
  8. python找出矩阵中的最大值_Python / Scipy:找到矩阵的“有界”最小值/最大值
  9. Oracle exp/imp导出导入命令及数据库备份
  10. 堆-动态的排序(洛谷1801-黑匣子)
  11. 图像增强︱window7+opencv3.2+keras/theano简单应用(函数解读)
  12. Quartz.Net定时任务简单实用(实例)
  13. STm32驱动74HC595引脚图时序图工作原理
  14. 卫星电话是直接与卫星通信还是通过地面站?
  15. 独创圆柱形投影,索尼高透光HOE全息显示方案详解
  16. 不积跬步无以至千里,不积小流无以成江海
  17. Oracle数据库的锁类型
  18. 关于 Burrows-Wheeler 变换和 Lempel-Ziv 解析的一些认识
  19. Webx系列之文件下载
  20. frame切换、多窗口切换

热门文章

  1. 让数据分析效率再提升50%,帆软FineBI V6.0版本最新剧透!
  2. well-known file is not secure
  3. mysql中存储gis数据结构_GIS空间数据库的设计
  4. 【数据库】数据库设计
  5. 公有云与私有云的区别
  6. 11【C语言 趣味算法】个人所得税问题(结构体应用):结构体的声明、定义结构体类型的三种方法等
  7. Web前端技术学习路线图 初阶+中阶+高阶
  8. 罗马数字转换(Java字符串练习)
  9. Maven构建项目时,使用指定的WebContent目录
  10. 煤炭及煤化工加工会产生什么危废_煤化工危废处置难在哪