zoukankan      html  css  js  c++  java
  • 二叉查找树实现实例(C语言)

    /* search_tree.h */
    
    #ifndef _SEARCH_TREE_H
    #define _SEARCH_TREE_H
    
    struct tree_node;
    typedef struct tree_node *position;
    typedef struct tree_node *search_tree;
    
    search_tree make_empty(search_tree t);
    position find(int x, search_tree t);
    position find_min(search_tree t);
    position find_max(search_tree t);
    search_tree insert_tree(int x, search_tree t);
    search_tree delete_tree(int x, search_tree t);
    int retrieve(position p);
    void preorder_print_search_tree(search_tree t);
    void inorder_print_search_tree(search_tree t);
    void postorder_print_search_tree(search_tree t);
    #endif
    /* search_tree.c */
    
    #include "search_tree.h"
    #include <stdio.h>
    #include <stdlib.h>
    
    struct tree_node
    {
        int element;
        search_tree left;
        search_tree right;
    };
    
    search_tree 
    make_empty(search_tree t)
    {
        if(t != NULL)
        {
            make_empty(t->left);
            make_empty(t->right);
            free(t);
        }
        return NULL;
    }
    
    position find(int x, search_tree 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 
    find_min(search_tree t)
    {
        if(t == NULL)
            return NULL;
        else if(t->left == NULL)
            return t;
        else
            return find_min(t->left);
    }
    
    position 
    find_max(search_tree t)
    {
        if(t == NULL)
            return NULL;
        else if(t->right == NULL)
            return t;
        else
            return find_max(t->right);
    }
    
    search_tree 
    insert_tree(int x, search_tree t)
    {
        if(t == NULL)
        {
            /* create and return a one-node tree */
            t = malloc(sizeof(struct tree_node));
            if(t == NULL)
            {
                printf("out of space!!!
    ");    
                exit(1);
            }
            else
            {
                t->element = x;
                t->left = NULL;
                t->right = NULL;
            }
        }
        else if(x < t->element)
            t->left = insert_tree(x, t->left);
        else if(x > t->element)
            t->right = insert_tree(x, t->right);;
        /* else x is in the tree already; we'll do nothing */
    
        return t;    /* do not forget this line */
    }
    
    search_tree 
    delete_tree(int x, search_tree t)
    {
        position tmpcell;
    
        if(t == NULL)
        {
            printf("element not found!
    ");
            exit(1);
        }    
        else if(x < t->element)    /* go left */
            t->left = delete_tree(x, t->left);
        else if(x > t->element)    /* go right */
            t->right = delete_tree(x, t->right);
        else if(t->left && t->right)    /* two children */
        {
            /* replace with smallest in right subtree */
            tmpcell = find_min(t->right);
            t->element = tmpcell->element;
            t->right = delete_tree(t->element, t->right);
        }
        else    /* one or zero children */
        {
            tmpcell = t;
            if(t->left == NULL)    /* also  handles 0 children */
                t = t->right;
            else if(t->right == NULL)
                t = t->left;
            free(tmpcell);
        }
        return t;
    }
    
    int 
    retrieve(position p)
    {
        return p->element;
    }
    
    void
    preorder_print_search_tree(search_tree t)
    {
        if(t != NULL)

        {
            printf("%d ", t->element);
            preorder_print_search_tree(t->left);
            preorder_print_search_tree(t->right);
        }
    }
    void
    inorder_print_search_tree(search_tree t)
    {
        if(t != NULL)
        {
            inorder_print_search_tree(t->left);
            printf("%d ", t->element);
            inorder_print_search_tree(t->right);
        }
    }
    void
    postorder_print_search_tree(search_tree t)
    {
        if(t != NULL)
        {
            postorder_print_search_tree(t->left);
            postorder_print_search_tree(t->right);
            printf("%d ", t->element);
        }
    }
    /* search_tree_test.c */
    
    #include "search_tree.h"
    #include <stdio.h>
    
    int 
    main(void)
    {
        search_tree t = NULL;
        position pmin, pmax;
        int min, max;
    
        t = make_empty(t);
        printf("insert 10 to search_tree
    ");
        t = insert_tree(10, t);
        printf("insert 4 to search_tree
    ");
        t = insert_tree(4, t);
        printf("insert 6 to search_tree
    ");
        t = insert_tree(6, t);
        printf("insert 18 to search_tree
    ");
        t = insert_tree(18, t);
        printf("insert 12 to search_tree
    ");
        t = insert_tree(12, t);
    
        pmin = find_min(t);
        pmax = find_max(t);
        
        min = retrieve(pmin);
        max = retrieve(pmax);
    
        printf("
    preorder traversal the search tree is  :");
        preorder_print_search_tree(t);
        printf("
    inorder traversal the search tree is   :");
        inorder_print_search_tree(t);
        printf("
    postorder traversal the search tree is :");
        postorder_print_search_tree(t);
        printf("
    min = %d
    max = %d
    ", min, max);
    
    }

    测试结果:

    image

  • 相关阅读:
    Yarn架构基本概况(二)
    Yarn架构基本概况(二)
    Yarn架构基本概况(二)
    Yarn架构基本概况(一)
    Yarn架构基本概况(一)
    Yarn架构基本概况(一)
    从Hadoop 安全机制原理到当今主流安全机制
    WebService数据示例
    CXF浅析
    WebService的网络协议
  • 原文地址:https://www.cnblogs.com/nufangrensheng/p/3620197.html
Copyright © 2011-2022 走看看