二叉查找树的基本实现-c语言

来源:互联网 发布:stm32 3轴控制算法 编辑:程序博客网 时间:2024/05/21 04:42
#include<stdio.h>#include<stdlib.h>struct BinaryTree;typedef BinaryTree *position;typedef position SearchTree;struct BinaryTree{    int Element;    position Left;    position right;};SearchTree creat(SearchTree t);//构造二叉树SearchTree MakeEmpty(SearchTree t);//这个函数把二叉树销毁了,空树。position Find(int x, SearchTree t);//寻找x的节点position FindMin(SearchTree t);//二叉树的最小节点position FindMax(SearchTree t);//二叉树的最大节点SearchTree Insert(int x, SearchTree t);//插入元素,返回树根SearchTree Delete(int x,SearchTree t);//int Retrieve(position p);//返回节点元素void PreOrderTraverse(SearchTree t);//先序遍历void midprint(SearchTree t);//中序遍历void traversingprint(SearchTree t);//后序遍历SearchTree creat(SearchTree t){    int num;    scanf("%d", &num);    t = (SearchTree)malloc(sizeof(struct BinaryTree));    if (t == NULL)    {        printf("No space!\n");        return NULL;    }    t->Element = num;    t->Left = NULL;    t->right = NULL;    return t;}SearchTree MakeEmpty(SearchTree t){    if (t != NULL)    {        MakeEmpty(t->Left);        MakeEmpty(t->right);        free(t);    }    return NULL;}position Find(int x, SearchTree t){    if (t == NULL)        return NULL;    if (t->Element == x)        return t;    else if (x < t->Element)        return Find(x, t->Left);    else        return Find(x, t->right);}position FindMin(SearchTree t){    if (t == NULL)        return t;    else if (t->Left == NULL)        return t;    else        return FindMin(t->Left);}position FindMax(SearchTree t){    if (t == NULL)        return NULL;    else if (t->right == NULL)        return t;    else        return FindMax(t->right);}SearchTree Insert(int x, SearchTree t){    if (t == NULL)    {        t = (SearchTree)malloc(sizeof(struct BinaryTree));        if (t == NULL)        {            printf("No space\n");            return NULL;        }        t->Element = x;        t->Left = t->right = NULL;    }    else if (x < t->Element)        t->Left = Insert(x, t->Left);    else if (x > t->Element)        t->right = Insert(x, t->right);    return t;}SearchTree Delete(int x,SearchTree t){    if (t == NULL)        return NULL;    else if (x < t->Element)            //小于t,递归查找        t->Left = Delete(x, t->Left);    else if (x > t->Element)        t->right = Delete(x, t->right);    else if (t->Left&&t->right)    //等于t,左右儿子齐全    {        position p;        p = FindMin(t->right);               //找到右子树的最小值,赋给t,然后再删除被复制的节点,确保只有一个。        t->Element = p->Element;        t->right = Delete(t->Element, t->right);    }    else        //等于t,只有一个儿子或者没有儿子    {        position p;        p = t;        if (t->Left == NULL)           //找个儿子接班,没有就置空。            t = t->right;        else if (t->right == NULL)            t = t->Left;        free(p);    }    return t;}int Retrieve(position p){    return p->Element;}void PreOrderTraverse(SearchTree t){    if (t)    {        printf("%d\n", t->Element);        PreOrderTraverse(t->Left);        PreOrderTraverse(t->right);    }}void midprint(SearchTree t){    if (t)    {        midprint(t->Left);        printf("%d\n", t->Element);        midprint(t->right);    }}void traversingprint(SearchTree t){    if (t)    {        traversingprint(t->Left);        traversingprint(t->right);        printf("%d\n", t->Element);    }}

测试一下

#include<stdio.h>#include"BinaryTree.h"int main(){    SearchTree t=NULL;    t = creat(t);    int n,num;    scanf("%d", &n);    while (n--)    {        scanf("%d", &num);        Insert(num, t);    }    position p;    p = FindMin(t);    printf("最小值是%d\n", p->Element);    p = FindMax(t);    printf("最大的值是%d\n", p->Element);    printf("先序遍历:\n");    PreOrderTraverse(t);    printf("中序遍历:\n");    midprint(t);    return 0;}
0 0
原创粉丝点击