c语言二叉树--实现

简介: /*系统环境:centos 5.8  *  *  */ #include #include #define MAXSIZE 200 struct node {     int score;     struct node *left;     struct...
/*系统环境:centos 5.8
 *
 *
 */
#include
#include
#define MAXSIZE 200
struct node
{
    int score;
    struct node *left;
    struct node *right;
};


struct tree
{
    int count;
    struct node *root;
};
struct tree *create_tree()
{
    struct tree *t;
    t=(struct tree*)malloc(sizeof (struct tree) );
    t->count=0;
    t->root=NULL;
    return t;
}

void inseart_tree(struct tree *t, int score)
{
    if(t->count==0)
    {
        struct node* n;
        n=(struct node*)malloc(sizeof (struct node) );
        n->score=score;
        n->left=NULL;
        n->right=NULL;

        t->count++;
        t->root=n;
    }
    else
    {
        struct node * n;
        struct node * p;
        int tmp;
        tmp=t->count;
        p=t->root;
        n=(struct node*)malloc(sizeof (struct node) );
        n->score=score;
        while(1)
        {   

            if(p->score > n->score)
            {
                if(p->left==NULL)
                {
                    p->left=n;
                    t->count++;
                    break;
                }
                p=p->left;

            }else if(p->score score)
            {
                if(p->right==NULL)
                {
                    p->right=n;
                    t->count++;
                    break;
                }
                p=p->right;
            }
            continue;

        }
    }
}
/*search*/
int search(struct tree *t, int score)
{
    struct node * p;
    p=t->root;
    while(1)
    {

        if(p->score==score)
        {
            printf("The score is%d\n",p->score);
            break;
        }else if(p->score > score)
        {
            if(p->left==NULL)
            {
                break;
            }
            p=p->left;

        }else
        {
            if(p->right==NULL)
            {
                break;
            }
            p=p->right;
        }
        continue;
    }
    return 0;
}
void delete_tree(struct tree *t,int score)
{
    struct node *p,*f,*s,*q;
    int flag,flag2;
    flag=flag2=0;
    p=t->root;
    while((p!=NULL)&&(!flag2))
    {
        if(p->score==score)
            flag2=1;
        else if(p->score>score)
        {
            f=p;
            p=p->left;
        }else
        {
            f=p;
            p=p->right;
        }

    }
    if(flag2)
    {
        if((p->left==NULL)||(p->right==NULL))
        {
            if(p->left==NULL)
            {
                if(p==t->root)
                    t->root=p->right;
                else
                {
                    s=p->right;
                    flag=1;
                }
            }
        }
        else
        {
            q=p;
            s=q->right;
            while(s->left!=NULL)
            {
                q=s;
                s=s->left;
            }
            s->left=p->left;
            if(q!=p)
            {
                q->left=s->right;
                s->right=p->right;
            }
            if(q==p)
                t->root=s;
            else
                flag=1;
        }
        if(flag)
        {
            if(p==f->left)
                f->left=s;
            else
                f->right=s;
        }
        free(p);

    }
    else
        printf("Don't have the node\n");

}
/*遍历二叉树*/
void traversing_binary_tree( struct tree *t)
{
    struct node *stack[MAXSIZE], *p;
    p=t->root;
    int top = -1;
    if (p!= NULL)
    {
        /* 根节点入栈 */
        top++;
        stack[top] = p;
        /* 栈不空时循环 */
        while (top > -1)
        {
            /* 出栈并访问该节点 */
            p = stack[top];
            top--;
            printf("%4d\n ", p->score);
            /* 右孩子入栈 */
            if (p->right!= NULL)
            {
                top++;
                stack[top] = p->right;
            }
            /* 左孩子入栈 */
            if (p->left != NULL)
            {
                top++;
                stack[top] = p->left;
            }
        }
        printf("\n");
    }
}
int main()
{
    struct tree *newtree;
    int score1;
    char c;
    score1=0;
    newtree=create_tree();
    printf("二叉树:\n");
    while(1)
    {
        printf("#------------#\n");
        printf("#  I:添加分数\n");
        printf("#  P:打印分数列表\n");
        printf("#  S:查找学生\n");
        printf("#  D:删除学生\n");
        printf("#  E:退出\n");
        printf("#------------#\n");
        printf("请选择输入:");
        scanf("%s",&c);
        switch(c)
        {
            case 'I':
            case 'i':
                inseart_tree(newtree,400);
                inseart_tree(newtree,200);
                inseart_tree(newtree,300);
                inseart_tree(newtree,100);
                inseart_tree(newtree,500);
                inseart_tree(newtree,600);
                break;
            case 'P':
            case 'p':
                printf("打印分数列表:\n");
                traversing_binary_tree(newtree);
                break;
            case 'S':
            case 's':
                printf("请输入要查询的分数:");
                scanf("%d",&score1);
                search(newtree,score1);
                printf("The count is%d\nThe score is%d\n",newtree->count,newtree->root->score);
                break;
            case 'D':
            case 'd':
                printf("请输入要删除的分数:");
                scanf("%d",&score1);
                delete_tree(newtree,score1);
                printf("删除OK!\n");
                break;
            case 'E':
            case 'e':
                exit(0);


        }
    }

}



目录
相关文章
|
6月前
|
C语言
C语言写二叉树
C语言写二叉树
51 0
|
存储 算法 C语言
【C语言数据结构(基础版)】第五站:树和二叉树(上)
【C语言数据结构(基础版)】第五站:树和二叉树
115 0
|
存储 算法 Java
【数据结构】二叉树的前中后序遍历(C语言)
【数据结构】二叉树的前中后序遍历(C语言)
|
6天前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
34 8
|
2月前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
|
2月前
|
存储 机器学习/深度学习 C语言
数据结构基础详解(C语言): 树与二叉树的基本类型与存储结构详解
本文介绍了树和二叉树的基本概念及性质。树是由节点组成的层次结构,其中节点的度为其分支数量,树的度为树中最大节点度数。二叉树是一种特殊的树,其节点最多有两个子节点,具有多种性质,如叶子节点数与度为2的节点数之间的关系。此外,还介绍了二叉树的不同形态,包括满二叉树、完全二叉树、二叉排序树和平衡二叉树,并探讨了二叉树的顺序存储和链式存储结构。
|
2月前
|
存储 算法 C语言
C语言手撕实战代码_二叉树_构造二叉树_层序遍历二叉树_二叉树深度的超详细代码实现
这段代码和文本介绍了一系列二叉树相关的问题及其解决方案。其中包括根据前序和中序序列构建二叉树、通过层次遍历序列和中序序列创建二叉树、计算二叉树节点数量、叶子节点数量、度为1的节点数量、二叉树高度、特定节点子树深度、判断两棵树是否相似、将叶子节点链接成双向链表、计算算术表达式的值、判断是否为完全二叉树以及求二叉树的最大宽度等。每道题目均提供了详细的算法思路及相应的C/C++代码实现,帮助读者理解和掌握二叉树的基本操作与应用。
|
2月前
|
存储 C语言
数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树
本文详细介绍了树与二叉树的应用,涵盖哈夫曼树与哈夫曼编码、并查集以及二叉排序树等内容。首先讲解了哈夫曼树的构造方法及其在数据压缩中的应用;接着介绍了并查集的基本概念、存储结构及优化方法;随后探讨了二叉排序树的定义、查找、插入和删除操作;最后阐述了平衡二叉树的概念及其在保证树平衡状态下的插入和删除操作。通过本文,读者可以全面了解树与二叉树在实际问题中的应用技巧和优化策略。
|
3月前
|
机器学习/深度学习 存储 C语言
C语言的二叉树
1.树概念及结构 1.1树的概念 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 补充定义: 有一个特殊的结点,称为根结点,根节点没有前驱结点。除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继。因此,树是递归定义的。 1.2 树的相关概念 节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6 叶节点或终端
|
6月前
|
C语言
【C语言/数据结构】二叉树(层序遍历|判断完全二叉树|性质)
【C语言/数据结构】二叉树(层序遍历|判断完全二叉树|性质)
317 52