数据结构学习——二叉查找树ADT(程序化)

参考资料:《数据结构与算法分析——C语言描述》4.3一节

#include<stdio.h>
#include<stdlib.h>
#define N 10

typedef struct BinTreeNode
{
    int data;
    struct BinTreeNode *left;
    struct BinTreeNode *right;
}BinTreeNode,*BinTree;

BinTree insert(BinTree T,int data);//二叉树节点的添加
void PrintTree(BinTree T,void (*p)(BinTree T));//打印操作
void PrintTreeNode(BinTree T);//打印一个节点
BinTree Delete(BinTree T,int data);//删除某个节点
BinTree FindMin(BinTree T);//查找最小节点
BinTree FindMax(BinTree T);//查找最大节点
int FindMaxSubMin(BinTree T);//最大节点与最小节点的差值

int main()
{
    int i=0,n=0;
    int data[N]= {10,23,11,98,111,87,34,11,154,4};
    BinTreeNode *root=NULL;
    BinTree p;
    for(i=0;i<N;i++)
    {
        root=insert(root,data[i]);
    }
    PrintTree(root,PrintTreeNode);

    n=FindMaxSubMin(root);
    printf("%d\n",n);

    p=FindMin(root);
    PrintTreeNode(p);

    p=FindMax(root);
    PrintTreeNode(p);

    printf("\n");
    root=Delete(root,154);
    printf("\n");
    PrintTree(root,PrintTreeNode);
    printf("\n");

    n=FindMaxSubMin(root);
    printf("%d\n",n);

    p=FindMin(root);
    PrintTreeNode(p);

    p=FindMax(root);
    PrintTreeNode(p);

    root=Delete(root,1154);

    free(root);
    free(p);
    return 0;
}

BinTree insert(BinTree T,int data)
{
    if(T==NULL)
    {
        T=malloc(sizeof(BinTreeNode));
        if(T==NULL)
            printf("Out of space!\n");
        else
        {
            T->data=data;
            T->left=NULL;
            T->right=NULL;
        }
    }
    else
    {
        if(data<T->data)
            T->left=insert(T->left,data);
        else
            T->right=insert(T->right,data);
    }
    return T;
}

void PrintTreeNode(BinTree T)
{
    printf("%d\t",T->data);
}

//中序遍历
void PrintTree(BinTree T,void (*p)(BinTree T))
{
   if(T!=NULL)
   {
       PrintTree(T->left,p);//打印左子树
       p(T);//打印节点
       PrintTree(T->right,p);//打印右子树
   }
}

BinTree Delete(BinTree T,int data)
{
    BinTree temp;
    if(T==NULL)
        printf("\n%d not found.\n",data);
    else
    {
        if(data<T->data)
            T->left=Delete(T->left,data);
        else
        {
            if(data>T->data)
                T->right=Delete(T->right,data);
            else
            {
                if( T->left &&  T->right)//two children
                {
                    temp=FindMin(T->right);
                    T->data=temp->data;
                    T->right=Delete(T->right,T->data);
                }
                else//one or zero child
                {
                    temp=T;
                    if(T->left==NULL)
                        T=T->right;
                    else
                    {
                        if(T->right==NULL)
                            T=T->left;
                    }
                    free(temp);
                }
            }
        }
    }
    return T;
}

BinTree FindMin(BinTree T)
{
    if(T==NULL)
        return NULL;
    else
        if(T->left==NULL)
            return T;
        else return FindMin(T->left);
}

BinTree FindMax(BinTree T)
{
    if(T==NULL)
        return NULL;
    else
        if(T->right==NULL)
            return T;
        else return FindMax(T->right);
}

int FindMaxSubMin(BinTree T)
{
    int Max,Min;
    BinTree p;
    p=T;
    if(T==NULL)
        return 0;
    while(T->left!=NULL)
        T=T->left;
    Min=T->data;
    while(p->right)
        p=p->right;
    Max=p->data;
    return (Max-Min);
}
时间: 2024-10-10 22:44:16

数据结构学习——二叉查找树ADT(程序化)的相关文章

小猪的数据结构学习笔记(二)

小猪的数据结构学习笔记(二) 线性表中的顺序表 本节引言: 在上个章节中,我们对数据结构与算法的相关概念进行了了解,知道数据结构的 逻辑结构与物理结构的区别,算法的特性以及设计要求;还学了如何去衡量一个算法 的好坏,以及时间复杂度的计算!在本节中我们将接触第一个数据结构--线性表; 而线性表有两种表现形式,分别是顺序表和链表;学好这一章很重要,是学习后面的基石; 这一节我们会重点学习下顺序表,在这里给大家一个忠告,学编程切忌眼高手低,看懂不代表自己 写得出来,给出的实现代码,自己要理解思路,自己

数据结构学习笔记——绪论

数据结构学习笔记——绪论 为了更贴切的描述一种数据结构,通常采用二元组表示:(对于一种数据结构其逻辑结构唯一) B=(D,R)其中,B是一种数据结构,它由数据元素的集合D和D上二元关系的集合R所组成.即D={ di | 1 <= i<= n, n > 0}R={ rj | 1 <= j<= n, n > 0}D 上的一个关系r是序偶的集合,对于r中任一序偶<x,y>(x,y属于集合D),把x叫做偶序第一节点,把y叫做偶序第二结点,又称序偶的第 一结点为第二结

小猪的数据结构学习笔记(四)

小猪的数据结构学习笔记(四) 线性表之静态链表 --转载请注明出处:coder-pig 本章引言: 在二,三中中我们分别学习了顺序表中的线性表与单链表,线性表有点类似于 我们前面所学的数组,而单链表使用的最多的是指针,这里问个简单的问题, 如果是在以前没有指针的话,前辈先人们怎么实现单链表呢?大家思考下! 没有指针,那么用什么来代替呢?前辈先人们非常机智,想出了使用下标+游标的方式 来实现单链表的效果!也就是今天要讲的--静态链表! 当然你也可以直接跳过本章,因为有了单链表就没有必要用静态链表了

学习随想----按照“程序化”来管理我们的学习

有的时候,总是在思考我们所学的技术能够指导我们的生活跟工作不能.在今晚听完包老师的课后,好像有所启发. 第一堂课讲的是面向云计算,实时数据处理的数据中心.虽说内容记忆了许多,但是对未来的趋势个人觉得把握的很好.详细讲解了为什么服务器市场是那么的重要,同时也有点明白华为为什么那么看重他的服务器产品线.实际上,未来的趋势,IDC会占很大的趋势,云的推出势必会将用户的存储投资一降再降.大量的文件会存储在远端服务器上.当前的矛盾主要集中在用户的感知响应时间上,而这一方面,除去网络及用户端的响应时间上,数

数据结构学习日记2:实现一个简单的线性表功能(链式存储方式)

数据结构学习日记,此次是用链表来实现一个线性表的功能 // ListTable1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using namespace std; #define ERROR 0; #define OK 1; typedef int Status; typedef int ElemType; //声明一个节点 typedef struct Node { ElemType d

数据结构学习之二叉排序树

介绍:二叉排序树是以一定的规则排列树中元素,因而可以进行快速的排序和查询的树状数据结构,一般规则是:对于树中任意一个节点,左孩子严格小于根,根严格小于右孩子,有点像大根堆.(只是大根堆中左右孩子关系并不确定,且和根的关系是统一的,而且有上浮和下沉操作使得大根堆总是一棵完全二叉树,其不断弹出堆顶形成有序列的过程叫做堆排序.虽然二叉排序树中也有旋转操作使得树尽量平衡,但是由于数值大小分明的左右孩子,在进行平衡操作时远不如大根堆方便快捷.)对于一棵已经构造完成的排序二叉树,它的中序遍历序列即为升序排列

数据结构:二叉查找树(C语言实现)

数据结构:二叉查找树(C语言实现) ?写在前面 关于二叉树的基础知识,请看我的一篇博客:二叉树的链式存储 说明: 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: 1.若其左子树不空,则左子树上所有结点的值均小于它的根结点的值: 2.若其右子树不空,则右子树上所有结点的值均大于它的根结点的值; 3.其左.右子树也分别为二叉排序树 ?二叉查找树的建立(插入): 说明: 二叉树的创建是二叉树反复插入节点所构造出来的! 若二叉树为空树,则插入元素作为树根节点. 若根结点的键值等于key,则插入失

文章分享:简单数据结构学习:单向链表

文章分享:简单数据结构学习:单向链表:https://www.textarea.com/aprikyb/jiandan-shujujiegou-xuexi-danxiang-lianbiao-252/

数据结构学习系列之线性表(三)

前言数据结构学习,发现坚持下来比较难,本次学习与上次学习间隔了几个月,不管怎样还是要强迫自己坚持下来. 静态链表 用数组模拟链式结构的线性表,对于没有指针的编程语言,只能使用这种方式来模拟.这是大师们想出来的实现方法,体会大师们的编程思路,站在大师们的肩膀上解决一个又一个的难题.每个节点包含一个游标(数组数字索引),用于指向下个节点,所以静态链表也称为游标链表.规定数组第一个元素为备用链表(未被使用的数组游标,静态链表初始化时,会生成备用链表)的头节点,数组最后一个元素为链表的头节点.当需要插入