| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 748 人关注过本帖
标题:二叉搜索树操作~
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏
 问题点数:0 回复次数:0 
二叉搜索树操作~
失眠~敲代码~

程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>

struct node  
{
    int value;

    struct node* left;
    struct node* right;
};

typedef struct node NODE;
typedef struct node* PNODE;

void menu();                          //菜单

int my_scanf();                       //输入函数

void new_node(PNODE* n,int value);    //创造一个新节点

void free_node(PNODE* n);             //释放节点

void free_tree(PNODE* n);             //释放二叉树

PNODE find_node(PNODE n,int value);   //查找节点

void insert_node(PNODE* n,int value); //插入节点 

int get_max_depth(PNODE n);           //最长位置

int get_min_depth(PNODE n);           //最短位置

int get_num_nodes(PNODE n);           //获取节点数目

int get_min_value(PNODE n);           //最短路径长度

int get_max_value(PNODE n);           //最长路径长度

void deletenode(PNODE* n);             //删除节点

void delete_node(PNODE* n,int value);  

void pre_order_traversal(PNODE n);     //前序遍历

void in_order_traversal(PNODE n);      //中序遍历

void post_order_traversal(PNODE n);    //后序遍历

int main()
{
    int option=0;

    PNODE tree=NULL;
    PNODE node=NULL;

    while (1)
    {
        system("cls");

        menu();

        option=my_scanf();

        puts("---------------------------------");

    if (option<0||option>11)
    {    
         fprintf(stderr,"invalid option\n");
         system("pause");

         continue ;
    }


        switch (option)
        {
            case 0:

                exit(0);

            case 1:

                printf("Enter number to inserrt:");

                option=my_scanf();

                puts("\n");

                insert_node(&tree,option);

                break;

            case 2:

                printf("Enter number to delete:");

                option=my_scanf();

                puts("\n");

                delete_node(&tree,option);

                break;

            case 3:

                printf("Enter number to find");

                option=my_scanf();

                puts("\n");

                node=find_node(tree,option);

                if (node!=NULL)
                    puts("Found node\n");
                else
                    puts("Couldn't find node\n");

                break;

            case 4:

                puts("Pre order traversal:");

                pre_order_traversal(tree);

                puts("\n");

                break;


            default :

                break;

            case 5:

                puts("In order traversal:");

                in_order_traversal(tree);

                puts("\n");

                break;

            case 6:

                puts("Post order traversal:");

                post_order_traversal(tree);

                puts("\n");

                break;

            case 7:

                printf("Max depth is %i\n\n",get_max_depth(tree));

                break;

            case 8:

                printf("Min depth is %i\n\n",    get_min_depth(tree));

            case 9:

                printf("Max value is %i\n\n",get_max_value(tree));

                break;

            case 10:

                printf("Min value is %i\n\n",get_min_value(tree));

                break;

            case 11:

                printf("Node Count is %i\n\n",get_num_nodes(tree));

                break;

        }

        system("pause");

    }

    return 0;
}

void menu()
{
    puts("---------------------------------");
    puts("0 Exit");
    puts("1 Insert node");
    puts("2 Delete node");
    puts("3 Find node");
    puts("4 Pre order traversal");
    puts("5 In order traversal");
    puts("6 Post order traversal");
    puts("7 Max depth");
    puts("8 Min depth");
    puts("9 Max value");
    puts("10 Min value");
    puts("11 Node Count\n");
    puts("---------------------------------");
    printf("Select an option:");
}

int my_scanf()
{
    char buf[50]={0};

    int option=0;

    fgets(buf,sizeof (buf),stdin);
    sscanf(buf,"%i",&option);

    return option;
}

void new_node(PNODE* n,int value)    //创建节点
{
    *n=(PNODE)malloc(sizeof (NODE));//开辟一个节点

    if (*n!=NULL)
    {
        (*n)->value=value;   //赋值
        (*n)->left=NULL;     //初始化
        (*n)->right=NULL;   
    }
}

void free_node(PNODE* n)      //释放节点
{
    if ((*n)!=NULL)
        free(*n);

    *n=NULL;
}
  
void free_tree(PNODE* n)      //释放二叉树
{
    if (*n==NULL)  
        return ;

    if ((*n)->left!=NULL)  
        free_tree(&(*n)->left);   //进行递归释放左节点

    if ((*n)->right!=NULL)
        free_tree(&(*n)->right);  //进行递归释放右节点

    free_node(n);                 //释放节点

    *n=NULL;
}

PNODE find_node(PNODE n,int value) //查找节点
{
    if (n==NULL)                          //如果节点为空则返回
        return NULL;

    if (n->value==value)                  //如果找到数据,则返回该数据的指针
        return n;
  
    if (value<=n->value)                  
         return find_node(n->left,value);

    return find_node(n->right,value); 

}

void insert_node(PNODE* n,int value) //插入节点
{
    if (*n==NULL)   //找到插入的位置
        new_node(n,value);       
    else if (value==(*n)->value)
        return ;
    else if (value<(*n)->value)
        insert_node(&((*n)->left),value);
    else
        insert_node(&((*n)->right),value);

}

int get_max_depth(PNODE n)   //最长位置
{
    int left=0;
    int right=0;

    if (n==NULL)
        return 0;

    if (n->left!=NULL)
        left=get_max_depth(n->left)+1;

    if (n->right!=NULL)
        right=get_max_depth(n->right)+1;

    return (left>right?left:right);
}

int get_min_depth(PNODE n)           //最短位置
{
    int left=0;
    int right=0;

    if (n==NULL)
        return 0;

    if (n->left!=NULL)
        left=get_min_depth(n->left)+1;

    if (n->right!=NULL)
        right=get_min_depth(n->right)+1;

    return (left<right?left:right);
}

int get_num_nodes(PNODE n)           //获取节点数目
{
    int left=0;
    int right=0;

    if (n==NULL)
        return 0;

    if (n->left!=NULL)
        left=get_num_nodes(n->left);

    if (n->right!=NULL)
        right=get_num_nodes(n->right);

    return (left+1+right);
}

int get_min_value(PNODE n)           //最短路径长度
{
    if (n==NULL)
        return 0;

    if (n->left==NULL)
        return n->value;

    return get_min_value(n->left);
}

int get_max_value(PNODE n)           //最大路径长度
{
    if (n==NULL)
        return 0;

    if (n->right==NULL)
        return n->value;

    return get_max_value(n->right);
}

void deletenode(PNODE *n)    //删除节点
{
    PNODE tmp=NULL;

    if ((*n)==NULL)
        return ;

    if ((*n)->right==NULL)
    {
        tmp=*n;
        *n=(*n)->left;

        free_node(n);
    }
    else if ((*n)->left==NULL)
    {
        tmp=*n;
        *n=(*n)->right;

        free_node(n);
    }
    else 
    {
        for (tmp=(*n)->right;tmp->left!=NULL;tmp=tmp->left);

        tmp->left=(*n)->left;

        tmp=(*n);

        *n=(*n)->right;

        free_node(&tmp);
    }
}

void delete_node(PNODE* n,int value)
{
    PNODE node=NULL;

    if ((*n)==NULL)
        return ;

    node=find_node(*n,value);

    if ((*n)->value==value)
        deletenode(n);
    else if (value<(*n)->value)
        delete_node(&((*n)->left),value);
    else 
        delete_node(&((*n)->right),value);
}

void pre_order_traversal(PNODE n)      //前序遍历
{
    if (n!=NULL)
    {
        printf("%i ",n->value);

        pre_order_traversal(n->left);
        pre_order_traversal(n->right);
    }
}

void in_order_traversal(PNODE n)       //中序遍历
{
    if (n!=NULL)
    {
        in_order_traversal(n->left);

        printf("%i ",n->value);

        in_order_traversal(n->right);
        
    }
}

void post_order_traversal(PNODE n)     //后序遍历
{
    if (n!=NULL)
    {
        post_order_traversal(n->left);
        post_order_traversal(n->right);

        printf("%i ",n->value);
    }
}
2017-03-12 02:34
快速回复:二叉搜索树操作~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.046081 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved