问题描述及代码:

#ifndef BTREE_H_INCLUDED
#define BTREE_H_INCLUDED
/*
*烟台大学计控学院
*作    者:杨征
*完成日期:2015年11月30日
*问题描述:认真阅读并验证二叉排序树相关算法。
(1)由整数序列{43,52,75,24,10,38,67,55,63,60}构造二叉排序树;
(2)输出用括号法表示的二叉排序树;
(3)用递归算法和非递归算法查找关键字55;
(4)分别删除43和55,输出删除后用括号法表示的二叉排序树。*/
#endif // BTREE_H_INCLUDED
#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=10,x=43;KeyType a[]= {43,52,75,24,10,38,67,55,63,60,};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;}

运行结果:

知识点总结:

二叉排序树的基本运算

学习心得:

还是需要多画图

第14周—项目1(3)二叉排序树相关推荐

  1. 数据结构上机实践第14周项目3 - 是否二叉排序树

    是否二叉排序树? 项目要求如下: 设计一个算法,判断给定的二叉树是否是二叉排序树. int JudgeBST()是设计的算法对应的实现. 实现源代码如下: //*Copyright (c)2017,烟 ...

  2. 数据结构上机实践第14周项目1(3) - 验证算法(二叉排序树)

    验证算法(二叉排序树) 项目要求如下: 认真阅读并验证二叉排序树相关算法.  (1)由整数序列{43,52,75,24,10,38,67,55,63,60}构造二叉排序树:  (2)输出用括号法表示的 ...

  3. 数据结构上机实践第14周项目1(4) - 验证算法(平衡二叉树)

    验证算法(平衡二叉树) 项目要求如下: (1)由整数序列{43,52,75,24,10,38,67,55,63,60}构造AVL树:  (2)输出用括号法表示的AVL树:  (3)查找关键字55:  ...

  4. 数据结构上机实践第14周项目2 - 二叉树排序树中查找的路径

    二叉树排序树中查找的路径 项目要求如下: 设计一个算法,输出在二叉排序中查找时查找某个关键字经过的路径.  专为本项目设计的算法体现在函数int SearchBST(-)和void SearchRes ...

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

    验证算法(分块查找) 项目要求如下: 请用22,4,23,11,20,2,15,13,30,45,26,34,29,35,26,36,55,98,56, 74,61,90,80,96,127,158, ...

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

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

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

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

  8. 第14周项目5-体会棋盘游戏中的数据存储

    /* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作 者:刘畅 * 完成日期:2014 年 11 ...

  9. 第14周项目3 - B-树的基本操作

    /**Copyright (c) 2017, 烟台大学计算机学院*All rights reserved.*文件名称:DSitem14-3.cpp*作 者:于子淇*完成日期:2017年12月5日*版 ...

最新文章

  1. ISME | 通过长读长宏基因组测序揭示南极土壤未培养细菌的生物合成潜力
  2. DNS解析与Bind的使用(2)
  3. 0523 CSS知识点
  4. 工业仪器仪表 界面设计_如何设计时尚的仪表板界面
  5. 腾讯视频vip会员_腾讯视频如何查看版本号
  6. java ftp模糊查询_前端js模糊搜索(模糊查询)
  7. Redis(3-3):列表类型
  8. python单链表实现具体例子_python中单链表的实现
  9. dp HDU - 5074
  10. Echart报错: Map china not exists. You can download map file on
  11. PG数据库创建视图并授权给新用户
  12. RTMP协议封装H264格式详解
  13. python pandas库的介绍和使用
  14. cajviewer阅读器打不开怎么解决
  15. iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 5000 -j DNAT --to-destinatio
  16. 99乘法口诀表用for循环
  17. 电商数据分析流程 | Excel实操
  18. 电脑使用技巧提升篇9:使用360压缩软件文件加密
  19. 第 1-6 课:Spring 的另一个核心机制 AOP
  20. Linux进程间通信方式

热门文章

  1. html期末作业代码网页设计——简洁日式料理餐饮(4页) HTML+CSS+JavaScript 父亲美食HTM5网页设计作业成品
  2. 计算机设备类型分类,计算机外围设备的分类,都有哪些设备
  3. Intellij IDEA的教程资料
  4. 【系统优化】新装Linux系统注意事项增加系统安全
  5. 「Nginx」什么是代理
  6. 宜建立自主可控的车用芯片和操作系统技术体系
  7. 杭州计算机职称考试培训,杭州全国职称英语等级考试强化培训班(综合类)
  8. 手把手教你脑电波采集及信号处理分析
  9. 解决[WinError 87] pip自动安装不成功问题
  10. OSError: [WinError 87] 参数错误。