二叉排序

二叉排序,附带插入,查找和删除值。。

/*
  Author: buer
  Date: 2017/9/18 11:56:02
*/

#include <stdio.h>
#include <stdlib.h>

typedef struct Tree
{
    int data;
    struct Tree *lchild;
    struct Tree *rchild;
}Tree;

void createBiTree(Tree *root);
void insertData(Tree *root, int data);
void printTree(Tree *root);
int search(Tree *root,int key);
int delTree(Tree *root,int key);

int main(int argc, char *argv[])
{
    int key, result;
    Tree root = {0, NULL, NULL};

    createBiTree(&root);

    printf("排序结果:\n");
    printTree(&root);

    printf("\n输入要查找的值:\n");
    scanf("%d", &key);
    result = search(&root, key);

    if(result)
    {
        printf("找到了%d\n", key);
    }else {
        printf("没找到\n");
    }

    printf("输入插入的值:");
    scanf("%d", &key);
    insertData(&root, key);

    printf("排序结果:\n");
    printTree(&root);

    printf("\n输入要删除的值:\n");
    scanf("%d", &key);
    result = delTree(&root, key);

    if(result)
    {
        printf("找到了%d,删除\n", key);
    }else {
        printf("没找到\n");
    }
    printTree(&root);
    return 0;
}

void createBiTree(Tree *root)
{
    int data;
    scanf("%d", &data);

    while(data != 0)
    {
        if(data == ‘ ‘)
        {
            scanf("%d", &data);
            continue;
        }
        insertData(root, data);
        scanf("%d", &data);
    }
} 

void insertData(Tree *root, int data)
{
    if(!root->data)
    {
        root->data = data;
    }
    else
    {
        if(root->data == data)
        {
            return;
        }
        else if(root->data > data)
        {
            if(!root->lchild)
            {
                root->lchild = (Tree *)malloc(sizeof(Tree));
                root->lchild->data = 0;
                root->lchild->lchild = NULL;
                root->lchild->rchild = NULL;
            }
            insertData(root->lchild, data);
        }
        else
        {
            if(!root->rchild)
            {
                root->rchild = (Tree *)malloc(sizeof(Tree));
                root->rchild->data = 0;
                root->rchild->lchild = NULL;
                root->rchild->rchild = NULL;
            }
            insertData(root->rchild, data);
        }
    }
}

void printTree(Tree *root)
{
    if(!root)
    {
        return;
    }
    printTree(root->lchild);
    printf("%d ", root->data);
    printTree(root->rchild);
}

int search(Tree *root, int key)
{
    if(!root)
    {
        return 0;
    }
    else if(root->data == key)
    {
        return 1;
    }
    else if(root->data > key)
    {
        return search(root->lchild, key);
    }
    else
    {
        return search(root->rchild, key);
    }

}

int delTree(Tree *root,int key)
{
    Tree *p = root;
    Tree *pre, *tmp;

    while(p)
    {
        if(p->data == key)
        {
            break;
        }else if(p->data > key)
        {
            tmp = p;
            p = p->lchild;
        }else
        {
            tmp = p;
            p = p->rchild;
        }
    }
    if(p == NULL)
    {
        return 0;
    }

    if(p->lchild == NULL && p->rchild == NULL)
    {
        if(tmp->data > key)
        {
            tmp->lchild = NULL;
        }else {
            tmp->rchild = NULL;
        }
        free(p);
        return 1;
    }
    if(p->lchild == NULL)
    {
        if(tmp->data > key)
        {
            tmp->lchild = p->rchild;
        }else {
            tmp->rchild = p->rchild;
        }
        free(p);
        return 1;
    }
    if(p->rchild == NULL)
    {
        if(tmp->data > key)
        {
            tmp->lchild = p->lchild;
        }else {
            tmp->rchild = p->lchild;
        }
        free(p);
        return 1;
    }

    pre = p;
    tmp = p->lchild;
    while(tmp->rchild)
    {
        pre = tmp;
        tmp = tmp->rchild;
    }
    if(pre == p)
    {
        p->data = tmp->data;
        p->lchild = NULL;
        free(tmp);
        return 1;
    }
    if(tmp->lchild == NULL)
    {
        p->data = tmp->data;
        pre->rchild == NULL;
        free(tmp);
        return 1;
    }
    p->data = tmp->data;
    tmp->data = tmp->lchild->data;
    free(tmp->lchild);
    tmp->lchild = NULL;
    return 1;

}
时间: 2024-10-25 23:30:14

二叉排序的相关文章

[数据结构与算法]二叉排序(搜索)树实现

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4289804.html 定义 二叉排序树又称二叉查找树或二叉搜索树,它或者是一棵空树,或者是具有如下性质的二叉树:1.若它是左子树非空,则左子树上所有节点的值均小于根节点的值2.若它的右子树非空,则右子树上所有节点的值均大于根节点的值3.左.

9-7-平衡二叉排序(搜索)树-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第9章  查找 - 平衡二叉排序(搜索)树 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Base.c        相关测试数据下载  链接? 数据包    

数据结构之树篇2——二叉排序(查找,搜索)树

二叉排序树 引入 基本性质: 二叉排序树(又叫二叉搜索.查找树) 若左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若右子树不空,则右子树上所有结点的值均大于它的根结点的值: 左.右子树也分别为二叉排序树. 不允许有键值相同结点. 二分查找与二叉排序树 ? 二分查找也称为折半查找,要求原线性表有序,它是一种效率很高的查找方法.如果在需要进行频繁修改的表中采用二分查找,其效率也是非常低下的,因为顺序表的修改操作效率低.如果只考虑频繁的修改,我们可以采用链表.然而,链表的查找效率又非常低.

二叉搜索树(二叉排序搜索树)

二叉搜索树 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4117    Accepted Submission(s): 1802 Problem Description 判断两序列是否为同一二叉搜索树序列 Input 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接下去一行是一个序列,序列长度

数据结构——二叉排序(查找、搜索)树

2. 二叉排序树 2.1 二叉排序树(又叫二叉搜索.查找树) 性质: 若左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值: 左.右子树也分别为二叉排序树. 数列的顺序不同创建出来的二叉排序树是会不一样的! (65 ,32,87, 46,71,98, 39) 每一层数字的顺序是可以换的,32和87是可以换的.          (32,39,46,65,71,87,89)    如果实际应用中遇到相同的值,那么向左向右插入都可

7-24 树种统计(25 分)(二叉排序的应用)

随着卫星成像技术的应用,自然资源研究机构可以识别每一棵树的种类.请编写程序帮助研究人员统计每种树的数量,计算每种树占总数的百分比. 输入格式: 输入首先给出正整数N(≤10?5??),随后N行,每行给出卫星观测到的一棵树的种类名称.种类名称由不超过30个英文字母和空格组成(大小写不区分). 输出格式: 按字典序递增输出各种树的种类名称及其所占总数的百分比,其间以空格分隔,保留小数点后4位. 输入样例: 29 Red Alder Ash Aspen Basswood Ash Beech Yello

数据结构 - 从二叉搜索树说到AVL树(一)之二叉搜索树的操作与详解(Java)

二叉搜索树(Binary Search Tree),简称BST,顾名思义,一颗可以用于搜索的二叉树.BST在数据结构中占有很重要的地位,一些高级树结构都是其的变种,例如AVL树.红黑树等,因此理解BST对于后续树结构的学习有很好的作用.同时利用BST可以进行排序,称为二叉排序,也是很重要的一种思想. 二叉树的性质:任意一个节点的所有左子树元素都比该元素值要小,而所有右子树元素都比该元素值要大. 符合该性质的二叉树就是一颗二叉搜索树,当然前提下是树中不允许有重复元素. 所有的二叉搜索树的中序遍历序

数据结构之二叉搜索树、AVL自平衡树

前言 最近在帮公司校招~~ 所以来整理一些数据结构方面的知识,这些知识呢,光看一遍理解还是很浅的,看过跟动手做过一遍的同学还是很容易分辨的哟~ 一直觉得数据结构跟算法,就好比金庸小说里的<九阳神功>,学会九阳神功后,有了内功基础,再去学习其他武功,速度就有质的提升 内容大概包含这些,会分多篇文章来整理: 二叉搜索树 平衡二叉树(AVL) 二叉堆 堆排序 四叉树 八叉树 图,深度优先DFS.广度优先BFS 最短路径 二叉树 二叉树,也就是每个节点最多有两个孩子的树.多用于搜索,查找,还有可以用来

将二叉搜索树转变成排序的双向链表

将二叉搜索树转变成排序的双向链表: 点击链接: http://blog.csdn.net/l_tudou/article/details/51753921