二叉查找树的基本操作(建立,插入,删除,遍历)

来源:互联网 发布:手机淘宝怎么切换账号 编辑:程序博客网 时间:2024/05/17 23:32
#include <stdio.h>#include <stdlib.h>struct TreeNode;typedef struct TreeNode *Position;typedef struct TreeNode *SearchTree;typedef int ElementType;struct TreeNode{    ElementType Element;    SearchTree Left;    SearchTree Right;};SearchTree MakeEmpty(SearchTree T){    if(T!=NULL)    {        MakeEmpty(T->Left);        MakeEmpty(T->Right);        free(T);    }    return T;}/**    if(X<T->Element)        return Find(X,T->Left);    else if(X>T->Element)        return Find(X,T->Right);*递归的每一层都返回值X的指针,最终函数返回的是指向值X的指针*/Position Find(ElementType X,SearchTree T){    if(T==NULL)        return NULL;    if(X<T->Element)        return Find(X,T->Left);    else if(X>T->Element)        return Find(X,T->Right);    else        return T;}Position FindMin(SearchTree T){    if(T==NULL)        return NULL;    if(T->Left==NULL)        return T;    else        return FindMin(T->Left);}Position FindMax(SearchTree T){    if(T!=NULL)    {         while(T->Right!=NULL)            T=T->Right;    }/**return T结束本次递归的Insert函数,由于T->Left=Insert(X,T->Left);T->Right=Insert(X,T->Right);*有指针赋值情况,将T层层往上,递归最后一层指向了根节点,所以函数返回根节点的指针。*/    return T;}SearchTree Insert(ElementType X,SearchTree T){    if(T==NULL)    {        T=(struct TreeNode*)malloc(sizeof(struct TreeNode));        if(T==NULL)            printf("Out of space!!!");        else        {            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(ElementType X,SearchTree T){    Position TmpCell;    if(T==NULL)        printf("Element Not Found");    else if(X<T->Element)        T->Left=Delete(X,T->Left);    else if(X>T->Element)        T->Right=Delete(X,T->Right);    else if(T->Left&&T->Right)//有两个孩子    {        TmpCell=FindMin(T->Right);        T->Element=TmpCell->Element;        T->Right=Delete(T->Element,T->Right);    }    else//有一个或者零个孩子    {        TmpCell=T;        if(T->Left==NULL)            T=T->Right;        else if(T->Right==NULL)            T=T->Left;        free(TmpCell);    }    return T;}void PrintDLR(SearchTree T)//先序遍历二叉查找树{    if(T!=NULL)    {        printf("%3d\n",T->Element);    }    if(T->Left!=NULL)        PrintDLR(T->Left);    if(T->Right!=NULL)        PrintDLR(T->Right);}void PrintLDR(SearchTree T)//中序遍历二叉查找树{    if(T->Left!=NULL)    {        PrintLDR(T->Left);    }    printf("%3d\n",T->Element);    if(T->Right!=NULL)    {        PrintLDR(T->Right);    }}void PrintLRD(SearchTree T)//后序遍历二叉查找树{    if(T->Left!=NULL)    {        PrintLRD(T->Left);    }    if(T->Right!=NULL)    {        PrintLRD(T->Right);    }    printf("%3d\n",T->Element);}int main(){    SearchTree T;    T=(struct TreeNode*)malloc(sizeof(struct TreeNode));    T->Element=9;    T->Left=T->Right=NULL;    int arr[8]={6,2,1,8,7,10,3,18};    int i;    for(i=0;i<8;++i)    {        Insert(arr[i],T);    }//    printf("%3d\n",T->Element);    printf("中序遍历:");    PrintLDR(T);    printf("先序遍历:");    PrintDLR(T);    printf("后序遍历:");    PrintLRD(T);    return 0;}
0 0
原创粉丝点击