二叉排序树的构造,插入,删除,完整c代码实现

二叉排序树(完整代码) 目录二.二叉排序树1.二叉排序树(代码)P1087 FBI树 (建树)HDU 4707 Pet 二.二叉排序树 先序遍历:根->左->右 中序遍历:左->根->右 后序遍历:左->右->根 1.二叉排序树(代码) 输入 7 5 4 3 3 3 2 1 输出 1 2 3 3 3 4 5 //二叉排序树(左<根<右) #include<... 阅读详情
#include <stdio.h>  
#include <stdlib.h>   
typedef struct BiTNode{  
    int data;  
    struct BiTNode *lchild, *rchild;  
}BiTNode, *BiTree;   
//在给定的BST中插入结点,其数据域为element  
void BSTInsert( BiTree *t, int element )  
{  
    if( NULL == *t ) {  
        (*t) = (BiTree)malloc(sizeof(BiTNode));  
        (*t)->data = element;  
        (*t)->lchild = (*t)->rchild = NULL;  
    }  
  
    if( element == (*t)->data )  
        return ;  
  
    else if( element < (*t)->data )  
        BSTInsert( &(*t)->lchild, element );  
  
    else   
        BSTInsert( &(*t)->rchild, element );  
}  
  
//创建BST  
void CreateBST( BiTree *t, int *a, int n )  
{  
    (*t) = NULL;  
    for( int i=0; i<n; i++ )  
        BSTInsert( t, a[i] );  
}  
  
//BST的递归查找  
void SearchBST( BiTree t, int key )  
{  
    BiTree p;  
    p = t;  
    if( p ) {  
        if( key == p->data )  
            printf("查找成功!\n");  
        else if( (key < p->data) && (NULL != p->lchild) )  
            SearchBST( p->lchild , key );  
        else if( (key > p->data) && (NULL != p->rchild) )  
            SearchBST( p->rchild , key );  
        else  
            printf("无此元素!\n");  
    }  
}  
  
//BST结点的删除  
void DelBSTNode( BiTree t, int key )  
{  
    BiTree p, q;  
    p = t;  
    int temp;  
    while( NULL != p && key != p->data ) {  
        q = p;  
        if( key < p->data )  
            p = p->lchild ;  
        else  
            p = p->rchild ;  
    }  
  
    if( NULL == p )  
        printf("无此元素!\n");  
    else {  
        //情况1:结点p的双亲结点为q,且p为叶子结点,则直接将其删除。  
        if( NULL == p->lchild && NULL == p->rchild ) {  
            if( p == q->lchild )  
                q->lchild = NULL;  
            if( p == q->rchild )  
                q->rchild = NULL;  
            free(p);  
            p = NULL;  
        }  
        //情况2:结点p的双亲结点为q,且p只有左子树或只有右子树,则可将p的左子树或右子树直接改为其双亲结点q的左子树或右子树。  
        else if( (NULL == p->rchild && NULL != p->lchild) ) { //p只有左子树  
            if( p == q->lchild )  
                q->lchild = p->lchild ;  
            else if( p == q->rchild )  
                q->rchild = p->lchild ;  
            free(p);  
            p = NULL;  
        }  
        else if( NULL == p->lchild && NULL != p->rchild ) {       //p只有右子树  
            if( p == q->lchild )  
                q->lchild = p->rchild ;  
            if( p == q->rchild )  
                q->rchild = p->rchild ;  
            free(p);  
            p = NULL;  
        }  
        //情况3:结点p的双亲结点为q,且p既有左子树又有右子树。本代码使用直接前驱(也可以直接后继)  
      
        else if( NULL != p->lchild && NULL != p->rchild ) {  
                BiTree s, sParent;   
                sParent = p;  
                s = sParent->lchild ;  
                while( NULL != s->rchild )   {   //找到p的直接前驱  
                    sParent = s;  
                    s = s->rchild ;    
                }  
                temp = s->data ;   
                DelBSTNode( t, temp );  
                p->data = temp;  
        }  
    }  
  
}  
  
//中序遍历打印BST  
void PrintBST( BiTree t )  
{  


    if( t ) {  
        PrintBST( t->lchild);
        printf("%d ", t->data); 
        PrintBST( t->rchild);  
    } 


}  
  
int main()  
{  
    int n;  
    int *a;  
    int key;  
    BiTree t;  
    printf("请输入二叉查找树的结点数:\n");  
    scanf("%d", &n);    
    a = (int *)malloc(sizeof(int)*n);  
    printf("请输入二叉找树的结点数据:\n");  
    for( int i=0; i<n; i++ )  
    scanf("%d", &a[i]);  
    CreateBST( &t, a, n );  
    printf("当前二叉查找树的遍历为:\n");  
    PrintBST( t );  
    printf("\n");  
    printf("请输入要查找的元素:\n");  
    scanf("%d", &key);  
    printf("查找结果:\n");  
    SearchBST( t, key );        //递归查找  
    printf("\n");  
    printf("请输入要删除的元素:\n");  
    scanf("%d", &key);  
    DelBSTNode( t, key );  
    printf("当前二叉查找树的遍历为:\n");  
    PrintBST( t);  
    printf("\n");  
    return 0;  

}  


代码已实现!

二叉排序树完整代码 tree.h(存放函数声明): #pragma once #include<vector> #include<iostream> using namespace std; typedef struct BiTree { //所用的二叉树数据结构 int key; ... 阅读详情

相关推荐

【C++、数据结构】二叉排序树(二叉查找树、二叉搜索树)(图解+完整代码)

二叉搜索树/二叉排序树/二叉查找树:创建、插入、查找、删除(非递归以及递归版本代码),以及超详细步骤图解

金哥的博客 2446

详解:二叉排序树(二叉查找树)的代码实现——Scala

二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。是数据结构中的一类。在一般情况下,查询效率比链表结构要高。 二叉排序树的定义 一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树; (4)没有键值相等...

XMZHSY的博客 2547

二叉排序树(BST)的思路及C语言实现

请注意,为了能够更好的理解二叉排序树,我建议各位在看代码时能够设置好断点一步一步跟踪函数的运行过程以及各个变量的变化情况一.动态查找所面临的问题在进行动态查找操作时,如果我们是在一个无序的线性表中进行查找,在插入时可以将其插入表尾,表长加1即可;删除时,可以将待删除元素与表尾元素做个交换,表长减1即可。反正是无序的,当然是怎么高效怎么操作。但如果是有序的呢?回想学习线性表顺序存储时介绍的顺序表的缺点

kelvinmao的博客 1万+

二叉排序树(BST)--构造二叉排序树

已知一个有序序列,如何构造一个二叉排序树呢?

today2222的博客 9921

C/C++实现平衡二叉树的插入、删除、查询和各种遍历

1 平衡二叉树的插入      关于平衡二叉树的定义什么的,就不再多说。直接说说各种功能的c语言实现。 首先插入的时候需要进行旋转以保证树始终保持平衡。而旋转的类型有四种:L-L型旋转,L-R型旋转,R-L型旋转,R-R型旋转。其中L-L型和R-R型只需要进行一次基本旋转操作就可以调整平衡;另外两种需要进行两次方向相反的旋转操作,才能达到目标。四种旋转类型如下:       然后定义两种基本的旋转...

xwm1993的博客 7785

Eplan P8 API二次开发--插入符号(Symbol)功能(Function)并定义属性

1、目的 使用Eplan API在页中自动插入某个符号并按约定规则自动设置好属性 2. 步骤 一、基础信息 比如要在Eplan中自动插入一个电机的符号并定制属性,我们先要确定要插入的符号名,可以在Eplan中获取如下符号(Symbol)信息 可以知道我们待插入的符号名称为M3_1, 接下来,使用Visual Studio建立类库项目,并引用Eplan Api库 二、获取符号变量(SymbolVariant) 在Eplan中,当一个符号(Symbol)被插入到页中,这个符号的引用即变为一个(Function

如是道程序人生 4529

二叉排序树图解和代码实现

二叉排序树 二叉排序树(Binary sort tree,BST),又叫二叉查找树、二叉搜索树,或者是一棵空树;或者是具有下列性质的二叉树: ​ (1)若它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值; ​ (2)若它的右子树不为空,则右子树上所有节点的值均大于它的根节点的值; ​ (3)它的左、右子树也分别为二叉排序树。 (注:二叉排序树中没有值相同的节点) 二叉排序树属于一种动态查找表, 关于二叉排序树节点的代码实现: public class TreeNode { p

HX_2021 1487

螺丝锁付系统软件设计 C# Winform

视觉螺丝锁付系统软件设计 C# Winform ,这是其中通信子模块设计

weixin_42522973的博客 340

二叉排序树(BST)构造与应用

二叉排序树(BST)构造与应用           二叉排序树(BST):又称二叉查找树,其定义为:二叉排序树或者是空树,或者是满足以下性质的二叉树。        (1) 若它的左子树非空,则左子树上所有记录的关键字均小于根记录的值。        (2) 若它的右子树非空,则右子树上所有记录的关键字均大于根记录的值。        (3) 左、右子树本身又各是一棵二叉排序树。

火雨(Nick) 2万+

STM32+CubeMX实战:5步搞定LWIP HTTP服务器搭建(附常见编译错误解决)

本文详细介绍了基于STM32和CubeMX平台,快速搭建LWIP HTTP服务器的5步实战指南。内容涵盖从项目初始化、LWIP深度配置到解决经典的`HTTPD_FSDATA_FILE`编译错误,并分享了使用VSCode进行高效开发的工作流,旨在帮助嵌入式开发者快速实现网络功能并规避常见陷阱。

weixin_29192365的博客 573

小白快速上手 labelme:新手图像标注详解教程

本教程旨在帮助初次接触 labelme 的用户快速上手该软件,掌握基本操作与标注流程,为语义分割数据集做准备。

小白一枚~ 2万+

二叉排序树-2

#include #include #include #include #include #define LISTSIZE 10//初始化申请内存大小 #define ADDSIZE 1//每次增加的内存大小 #define STACKSIZE 100 typedef struct { int *data; int length;//所存元素占内存大小 in

cool_oyty的专栏 600

得利捷datalogic扫码枪调试说明

针对得利捷datalogic扫码枪快速调试并,可以根据详细步骤设置扫码枪,并配有tcp调试助手辅以验证,以达到快速调试完成扫码枪的工作。

Conway510的博客 1万+

【数据结构与算法】二叉排序树C实现(含完整源码)

二叉排序树(Binary Sort Tree,简称BST),又称二叉查找树,是红黑树、AVL树等的基础。它或是一棵空树,或者是具有下列性质的一棵二叉树: 1、若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 2、若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值; 3、它的左右子树也分别为二叉排序树。 二叉排序树通常有查找、插入、删除等操作。查找操作很简单,无非就是递归查找,有点类似二叉树遍历的过程。插入操作也不难,一般是先在二叉排序树pTree中查找,看是

兰亭风雨的专栏 3万+

欧姆龙多PLC串行链接模式的应用

欧姆龙多PLC串行链接模式的应用 一、如何将两台CP1H进行串行PLC连接(PLC串行链接) 主机侧设定 从机侧设定 二、 如何实现编程通信 主机侧的【PC连接模式】为【全部】的时候 ① 主机会把自己的地址从3100开始,按照【链接字】设定的字数个数发送到每个从机的3100开始进行存储。 ② 从机会把自己的地址从31n0开始,按照主机侧参数【链接字】设定的字数个数发送到主机的31n0开始进行存储。 注:(n为从机的地址号,若从机号不连续,则该编号的地址将不被定义..

u014202847的博客 3087

西门子PLC与汇川SV660P伺服速度模式配置实战指南

本文详细介绍了西门子S7-1200 PLC与汇川SV660P伺服驱动器在速度模式下的配置实战指南。从硬件接线、伺服参数配置到TIA Portal软件组态和PLC程序编写,提供了全面的操作步骤和实用技巧,帮助工程师快速解决伺服系统调试中的常见问题,确保系统稳定运行。

weixin_30316097的博客 500

二叉排序树的构造、查找、插入及删除算法的实现(C++)

二叉排序树的构造、查找、插入及删除算法的实现(C++) 转自这里 #include using namespace std; class BsTree { public: // 构造函数初始化树根为NULL,表示空树 BsTree (void) : m_pRoot (NULL), m_uSize (0) {} // 析构函数清空树 ~BsTree (void) { Clear

shidalong2014的专栏 3205

YOLOv8改进策略【Conv和Transformer】| CVPR-2023 BiFormer 稀疏自注意力,减少内存占用

本文记录的是利用双级路由注意力机制优化的目标检测网络模型。传统的复杂度高,随着输入空间分辨率增加,计算量呈平方增长,导致严重的可扩展性问题。而本文所使用的在获取全局信息的同时,通过区域到区域路由和令牌到令牌注意力的合理设计,减少了不必要的计算量。BiFormer: Vision Transformer with Bi-Level Routing Attention采用四阶段金字塔结构,与一些先进的视觉Transformer类似。在每个阶段,首先使用重叠的补丁嵌入(在第一阶段)或补丁合并模块(在第二到第四阶段

Limiiiing的博客 614

二叉排序树C/C++代码实现

二叉排序树(二叉查找树): 二叉排序树的一个重要性质:中序遍历一棵二叉 树时可以得到一个结点值递增的有序序列。 对于需要经常进行插入、 删除和查找运算的表,采用二叉排序树比较好 查找: 若二叉排序树为空,则查找失败,返回空指针。 若二叉排序树非空,将给定值key与根结点的关键字T->data.key进行比较: 1,若key等于T->data.key , 则查找成功,返回根结点地址; 2,若key小于T->data.key, 则递归查找左子树; 3,若key大于T->data.key

Ycy的博客 3238

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

二叉排序树(C语言简单实现)

二叉排序树(C语言简单实现) 本文参考自《大话数据结构》 如果查找的数据集是有序线性表,并且是顺序存储的,查找可以用折半、插值、斐波那契等查找算法来实现,可惜,因为有序,在插入和删除操作上,就需要耗费大量的时间。 二叉排序树(Binary Sort Tree),又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树。 若它的左子树不空,则左子树上所有结点的值均小于它的根结构的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树; 构造一棵二叉

DFGOMC的博客 3420

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

c语言程序构造二叉排序树,C语言实现二叉排序树的相关操作

本文链接:二叉排序树(Binary Sort Tree)c语言 二叉排序树,又称为二叉查找树。它或则是一颗空树,或者是带有以下性质的二叉树:构造二叉排序树的目的,并不是为了顺序,而是为了提升查找和插入删除关键字的速度。以下程序在DEV C++中安装运行通过。#include#include/*二叉树的二叉链表结点结构定义*/typedef struct BiTNode{int data;struc...

weixin_35569158的博客 1479

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

 二叉排序树c++代码及原理(插入、删除、查找、创建)

二叉排序树 二叉排序树又称“二叉查找树”、“二叉搜索树”。 二叉排序树:或者是一棵空树,或者是具有下列性质的二叉树: 1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 2. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 3. 它的左、右子树也分别为二叉排序树。 二叉排序树通常采用二叉链表作为存储结构。中序遍历二叉排序树可得到一个依据关键字的有序序列,一个无序序列可以通过构造一棵二叉排序树变成一个有序序列,构造树的过程即是对无序序列进行排序的过程。每次插入的.

时间虚掷的孤岛 2333

二叉排序树详解以及实现

二叉排序树详解以及实现

Keep_Trying_Go的博客 3317

【数据结构】树(五)—— 二叉排序树(C语言版)

【数据结构】二叉排序树(C语言版)前言一、二叉排序树的定义二、二叉排序树的性质三、二叉排序树的操作二叉排序树常用存储结构二叉排序树的查找(递归实现)查找"二叉树T"中键值为 key 的节点(非递归实现)查找"二叉树T"中键值为 key 的节点二叉排序树的插入二叉排序树的创建二叉排序树的删除四、二叉树的查找性能分析应用区分:(与二分查找的应用区分)二叉排序树的构造树结构分析完整可运行代码 前言 二叉排序树(Binary Sort Tree,BST)又称为二叉查找树、二叉搜索树。与树型查找有关的结构有二叉排序树

haoweixl的博客 1万+

查找——二叉排序树(C语言实现)

二叉排序树(二叉查找树) 树表的提出: 1)如何在一个大型的数据集合上进行动态查找? (1)顺序查找:不要求元素的有序性,插入、删除的性能是O(1)查找性能是O(n)<需要一个个比较> (2)折半查找:查找性能是O(log2n)为保证元素的有序性,插入、删除要移动元素,性能是O(n) 2)树表(树表:将查找集合组织成树的结构–>二叉排序树)这种查找结构使得插入、删除、查找均具有较好效率。 基本概念: 1)二叉排序树(二叉查找树): 是一棵空的二叉树 是具有下列性质的二叉树: (1)若它的

weixin_45692018的博客 3455

王道数据结构笔记01-二叉排序树/二叉查找树/BST

二叉排序树,又称二叉查找树(BST,Binary Search Tree) 一棵二叉树或者是空二叉树,或者是具有如下性质的二叉树: 左子树上所有结点的关键字均小于根节点的关键字; 右子树上所有结点的关键字均大于根节点的关键字。 左子树和右子树又各是一棵二叉排序树。 即: 左子树结点值...............................................................................................................

testleaf.cn 4662
上一篇: 顺序表的查找
下一篇: 给出n个学生的考试成绩表,每条记录由学号、姓名和分数和名次组成,设计算法完成下列操作: (1)设计一个显示对学生信息操作的菜单函数如下所示: *************************
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值