原代码例如以下:

#include <stdlib.h>
#include <stdio.h>
//#define Key int
typedef int Key;
struct Item{
Key key;
char c;
};
typedef struct STnode* link;
struct STnode{
Item item ; link l,r; int N;
}; static link head , z ;
static struct Item NULLitem ; Key key(Item item){
return item.key;
}
//创建一个节点
link NEW(Item item, link l,link r, int N){
link x = (link)malloc(sizeof *x);
x->item = item;x->l = l;x->r = r;x->N = N;
if(head==z)head=x; //这句话不能少!。! return x;
}
//初始化
void STinit(){
head = ( z = NEW(NULLitem,0,0,0));
}
//节点个数
int STcount(){
return head->N;
}
//搜索子程序
Item searchR(link h, Key v){
Key t = key(h->item);
if(h==z)return NULLitem;
if(v==t) return h->item;
if(v<t) return searchR(h->l,v);
else return searchR(h->r,v);
}
//搜索主程序
Item STsearch(Key v){
return searchR(head,v);
}
//插入子程序
link insertR(link h, Item item){
Key v = key(item), t = key(h->item);
if(h==z)return NEW(item,z,z,1);
if(v<t) h->l = insertR(h->l,item);
else h->r = insertR(h->r,item);
(h->N)++;return h;
}
//插入主程序
link STinsert(Item item){
return insertR(head,item);
}
//删除子程序
Item deleteR(link F){
Item tmp; link p;
if(F->l==NULL){
p = F;
tmp = F->item;
F = F->r;
free(p);
return tmp;
}else return deleteR(F->l);
}
//删除子程序
void deleteRR(link h , Key v){ if(h!=NULL){
Key t = key(h->item);
if(v<t) deleteRR(h->l,v);
else if(v>t) deleteRR(h->r,v);
else
if(h->l==NULL) { //处理仅仅有一颗子树或没有子树的情况 1
link p = h->r; h=p; free(p);
}
else if(h->r==NULL){ //处理仅仅有一颗子树或没有子树的情况 2
link p = h->l; h=p; free(p);
}
else h->item= deleteR(h->r); //假设待删除的节点既有左子树又有右子树
//则用该节点右子树的最左下节点替换之。维持二叉搜索树
}
}
//删除主程序
void STdelete(Key v){
deleteRR(head,v);
} void sortR(link h){
if(h==z)return;
sortR(h->l);
if(h->item.key!=0)
printf("%d ",h->item.key);
sortR(h->r);
} void STsort(){
sortR(head);
} void test(){
struct Item item1 = {322,'a'};
struct Item item2 = {23,'a'};
struct Item item3 = {2,'a'};
struct Item item4 = {332,'a'};
STinit();
STinsert(item1);STinsert(item2);
STinsert(item4);STinsert(item3);
STsort();
printf("\n");
struct Item item11 = STsearch(23);
printf("%d\n",item11.key);
// STdelete(23);
STdelete(322);
STsort();
} main(){
test();
}

执行结果

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

基于二叉搜索树的符号表和BST排序的更多相关文章

  1. 6.1 集合和映射--集合Set->底层基于二叉搜索树实现

    前言:在第5章的系列学习中,已经实现了关于二叉搜索树的相关操作,详情查看第5章即可.在本节中着重学习使用底层是我们已经封装好的二叉搜索树相关操作来实现一个基本的集合(set)这种数据结构.集合set的 ...

  2. 剑指offer(20)二叉搜索树与双向表

    题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路一:递归法 1.将左子树构造成双链表,并返回链表头节点. 2.定位至左子 ...

  3. [Swift]LeetCode538. 把二叉搜索树转换为累加树 | Convert BST to Greater Tree

    Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original B ...

  4. [程序员代码面试指南]二叉树问题-在二叉树中找到两个节点的最近公共祖先、[LeetCode]235. 二叉搜索树的最近公共祖先(BST)(非递归)

    题目 题解 法一: 按照递归的思维去想: 递归终止条件 递归 返回值 1 如果p.q都不在root为根节点的子树中,返回null 2 如果p.q其中之一在root为根节点的子树中,返回该节点 3 如果 ...

  5. Convert Sorted List to Binary Search Tree——将链表转换为平衡二叉搜索树 &&convert-sorted-array-to-binary-search-tree——将数列转换为bst

    Convert Sorted List to Binary Search Tree Given a singly linked list where elements are sorted in as ...

  6. 用Python实现数据结构之二叉搜索树

    二叉搜索树 二叉搜索树是一种特殊的二叉树,它的特点是: 对于任意一个节点p,存储在p的左子树的中的所有节点中的值都小于p中的值 对于任意一个节点p,存储在p的右子树的中的所有节点中的值都大于p中的值 ...

  7. 二叉搜索树 C语言实现

    1.二叉搜索树基本概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是一棵具有如下特性的非空二叉树: (1)若它的左子树非空,则左子树上所有结点的关键字均小于根结点的关键字: (2)若它的右子树非 ...

  8. 【数据结构05】红-黑树基础----二叉搜索树(Binary Search Tree)

    目录 1.二分法引言 2.二叉搜索树定义 3.二叉搜索树的CRUD 4.二叉搜索树的两种极端情况 5.二叉搜索树总结 前言 在[算法04]树与二叉树中,已经介绍过了关于树的一些基本概念以及二叉树的前中 ...

  9. LeetCode刷题191130 --基础知识篇 二叉搜索树

    休息了两天,状态恢复了一下,补充点基础知识. 二叉搜索树 搜索树数据结构支持许多动态集合操作,包括Search,minimum,maximum,predecessor(前驱),successor(后继 ...

随机推荐

  1. Jsp页面,结果集分页和sql(top)分页的性能对比

    jsp页面两种分页模式: 第一种: 结果集分页,主要代码见下面: ResultSet rs=stmt.executeQuery(sql); ResultSetMetaData md=rs.getMet ...

  2. jstree的基本应用----记录

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  3. margin与padding如何进行区分

    margin与padding如何进行区分,这是很多学html人的困扰,其实说白了padding 就是内容与边框的空隙.而margin则是模块与模块的空隙.[3]

  4. CAD使用DeleteXData删除数据(网页版)

    主要用到函数说明: MxDrawEntity::DeleteXData 删除扩展数据,详细说明如下: 参数 说明 pzsAppName 删除的扩展数据名称,如果为空,删除所有扩展数据 js代码实现如下 ...

  5. Python之list、tuple、dict、set

    参考原文 廖雪峰Python PS:来看看Python中比较特殊的几种数据类型list.tuple.dict.set list list(列表)是Python内置的一种数据类型,它是一种有序.可变的集 ...

  6. Invalid ON UPDATE clause for 'create_date' column

    高版本的mysql导数据到低版本出现的问题 日期类型报错 解决方式:将datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT  中的  ON ...

  7. ubuntu wsl 子系统使用win10 系统ss代理步骤

    wind10 安装ss客户端 配置server 具体不多说 安装 ubuntu 子系统 3.安装python pip apt install python-pip 4.升级pip pip instal ...

  8. python爬虫26 | 把数据爬取下来之后就存储到你的MySQL数据库。

    小帅b说过 在这几篇中会着重说说将爬取下来的数据进行存储 上次我们说了一种 csv 的存储方式 这次主要来说说怎么将爬取下来的数据保存到 MySQL 数据库 接下来就是 学习python的正确姿势 真 ...

  9. Vue2.0 Props双向绑定报错简易处理办法

    在写项目的时候遇到了一个报错问题,虽然功能是正常运行,chrome的提示是:[Vue warn]: Avoid mutating a prop directly since the value wil ...

  10. Java基础学习总结(82)——Java泛型实例教程

    1.为什么需要泛型 泛型在Java中有很重要的地位,网上很多文章罗列各种理论,不便于理解,本篇将立足于代码介绍.总结了关于泛型的知识.希望能给你带来一些帮助. 先看下面的代码: List list = ...