C语言数据结构之二叉树

来源:互联网 发布:java考试题库 编辑:程序博客网 时间:2024/05/18 09:21
#include <stdio.h>
#include <stdlib.h>
//声明一个树的节点
typedef struct tree
{
    char node;
    struct tree *left;
    struct tree *right;
} TreeNode;
TreeNode * TreeRoot=NULL;//建立根节点
int IsEmptyTree(TreeNode *root)
{
    if(root==NULL)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
TreeNode *AddOneNode(TreeNode *Chileroot,TreeNode *NextPoint,char node)
{
    if(NextPoint!=NULL)
    {
        if(node<NextPoint->node)
        {
            AddOneNode(NextPoint,NextPoint->left,node);
        }
        else
        {
            AddOneNode(NextPoint,NextPoint->right,node);
        }
        return Chileroot;
    }
    else
    {
        NextPoint=(TreeNode *)malloc(sizeof(TreeNode));
        NextPoint->left=NULL;
        NextPoint->right=NULL;
        NextPoint->node=node;
        if(Chileroot!=NULL)
        {
            if(node<Chileroot->node)
            {
                Chileroot->left=NextPoint;
            }
            else
            {
                Chileroot->right=NextPoint;


            }
        }
        return NextPoint;
    }
}
void CreateTree()
{
    char tmp=0;
    printf("请输入树节点数据!\n");
    scanf("%c",&tmp);
    while(tmp!='.')
    {
        TreeRoot=AddOneNode(TreeRoot,TreeRoot,tmp);
        scanf("%c",&tmp);
    }
}
void MidorderDisplay(TreeNode *root)
{
    if(root==NULL)
    {
        //printf("i9898搜索失败!\n");
        return;
    }


    MidorderDisplay(root->left);
    printf("%c\n",root->node);
    MidorderDisplay(root->right);
}
void PreorderDisplay(TreeNode *root)
{
    if(root==NULL)
    {
        //printf("89搜索失败!\n");
        return;
    }


    printf("%c\n",root->node);
    PreorderDisplay(root->left);
    PreorderDisplay(root->right);
}


void PostorderDisplay(TreeNode *root)
{
    if(root==NULL)
    {
        //printf("=搜索失败!\n");
        return;
    }
    PostorderDisplay(root->left);
    PostorderDisplay(root->right);
    printf("%c\n",root->node);
}


TreeNode *Search(TreeNode *TreeRoot,char keynode)
{
    if(IsEmptyTree(TreeRoot))
    {
        printf("这是一个空树,搜索失败!\n");
        return;
    }
    while(TreeRoot->node!=keynode)
    {
        if(keynode<TreeRoot->node)
        TreeRoot=TreeRoot->left;
        else
        TreeRoot=TreeRoot->right;
        if(IsEmptyTree(TreeRoot))
        {
            break;
        }
    }
    return TreeRoot;
}
TreeNode *DeleNode(TreeNode *root,char keynode)
{
    TreeNode *Point,*Point1;
    if(IsEmptyTree(root))
    {
        printf("这是个空树!\n");
        return NULL;
    }
    if(root->node==keynode)//如果找到了
    {
        if(root->left==root->right)//这说明是空树
        {
            free(root);
            return NULL;
        }
        else if(root->left==NULL)
        {
            Point=root->right;
            free(root);
            return Point;
        }
        else if(root->right==NULL)
        {
            Point=root->left;
            free(root);
            return Point;
        }
        else
        {
            Point1=Point=root->right;


            //寻找root右边子树的最左节点
            while(Point->left!=NULL) Point=Point->left;
            Point=root->left;//将root左边的子树接到右子树的最左极点
            free(root);
            return Point1;
        }
    }
    else if(keynode>root->node)//如果当前节点小于关键字
    {
        root->right=DeleNode(root->right,keynode);
        return root;
    }
    else if(keynode<root->node)//如果当前节点大于关键字
    {
        root->left=DeleNode(root->left,keynode);
        return root;
    }
}
int main()
{
    TreeNode *tmp;
    char chartmp;
    CreateTree();
    printf("前序遍历!\n");
    PreorderDisplay(TreeRoot);
    printf("中序遍历!\n");
    MidorderDisplay(TreeRoot);
    printf("后续遍历!\n");
    PostorderDisplay(TreeRoot);
    chartmp=getchar();//这个是用于接收输入流中最后的一个换行符丢掉,以免被后面的scanf接收
    printf("输入你要搜索的数据:");
    scanf("%c",&chartmp);
    tmp=Search(TreeRoot,chartmp);
    if(tmp)
    {
        printf("%c 是你要找的吗\n",tmp->node);
    }
    else
    {
        printf("找不到 %c\n",chartmp);
    }
    chartmp=getchar();//这个是用于接收输入流中最后的一个换行符丢掉,以免被后面的scanf接收
    printf("输入你要删除的节点的数值:\n");
    scanf("%c",&chartmp);
    TreeRoot=DeleNode(TreeRoot,chartmp);
    printf("前序遍历!\n");
    PreorderDisplay(TreeRoot);
    printf("中序遍历!\n");
    MidorderDisplay(TreeRoot);
    printf("后续遍历!\n");
    PostorderDisplay(TreeRoot);
}