二叉排序树示例

二叉排序树示例
二叉排序树
收获:
  1. 要改变指针,参数就要用指针的指针。如insert (BinaryTree **current,TREE_TYPE value)。但只是输出或使用则使用指针就ok如 中序遍历函数 inOrderTraverse ( BinaryTree * root),这里的形参是指针。
  2. 中序遍历伪代码
    1. 如果根结点为空 则空操作
    2. 中序遍历左子树
    3. 输出 根结点值
    4. 中序遍历右子树
  3. 貌似关于树的递归的程序 第一句话都是在判断树根是否为空。

main.c源程序
#include <stdlib.h>
#include <stdio.h>
#include "binaryTree.h"                         /* 声明了关于二叉树函数原型的接口 */
#define N 6
/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  main
 *  Description:  二叉搜索树 示例主调函数
 *  Parameter:
 *  Create:14:58 2012-8-14
 *  Lastmodify:14:58 2012-8-14
 *  Author:        mang
 *  Version:       1.0
 * =====================================================================================
 */

    int
main ( int argc, char *argv[] )
{
    int a[N]={6,4,5,8,2,3};
    int i,k;   
    BinaryTree *tree=NULL;                      /*新建一个指向二叉搜索树的指针  */
    BinaryTree *result=NULL;

/*
 * 不断向二叉搜索树中插入结点
 */

    for (i = 0; i < N; i++) {
        insert(&tree,a[i]);                     /* 注意第一个实参是&tree 是指针的指针或者指针变量所在内存单元的地址 */
    }
    printf("中序遍历二叉搜索树\n");
    inOrderTraverse(tree);                      /* 中序遍历输出二叉搜索树 */


/* 
 * 下面是关于查找二叉排序树的代码
 */

    printf("\n输入要查找的值,输入0表示结束:");
    scanf("%d",&k);
    while(k!=0){
        if((result=find(tree,k))!=NULL){
            printf("找到啦,其地址为%d",(int)result); /* 返回的是指针,这里强制转换成整型 */
            printf("其值为%d\n",result->value);
        }
        else {
            printf("没有找到\n");
        }
       
        printf("\n输入要查找的值,输入0表示结束:");
        scanf("%d",&k);
    }

/*
 * 注意下面的写法有问题,当你输入k=0时 还会查找一遍 这里不删除,留着以后观摩
 */

//    do {
//        printf("\n输入要查找的值,输入0表示结束:");
//        scanf("%d",&k);
//        if((result=find(tree,k))!=NULL){
//            printf("找到啦,其地址为%d",result);
//            printf("其值为%d\n",result->value);
//        }
//        else {
//            printf("没有找到\n");
//        }
//    } while (k!=0);

    return EXIT_SUCCESS;
}                /* ----------  end of function main  ---------- */

binaryTree.h 源程序
这里对二叉树用到的函数做了个声明,可以当做一个接口。具体的函数实现由binarySearchTree.c完成。
#define TREE_TYPE int

struct binaryTree {
    TREE_TYPE value;
    struct biaryTree * left;
    struct biaryTree * right;
} /* optional variable list */;
typedef struct binaryTree BinaryTree;

void insert(BinaryTree **current,TREE_TYPE value);


BinaryTree *find(BinaryTree * tree,TREE_TYPE value );


void inOrderTraverse(BinaryTree *);

binarySearchTree.c源程序 关于二叉搜索树的所有函数都在这里。包括插入 中序遍历 查找
#include <stdlib.h>
#include <stdio.h>
#include "binaryTree.h"

/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  insert
 *  Description:向二叉搜索树中插入元素。是以链表的形式表示结点,所以这里不受元素个数的限制。  
 *  Parameter: BinaryTree **current
 *             TREE_TYPE value  要插入的值。其中TREE_TYPE在binaryTree.h另define为int
 *  Create:15:05 2012-8-14
 *  Lastmodify:15:05 2012-8-14
 *  Author:      mang
 *  Version:     1.0
 * =====================================================================================
 */

    void
insert (BinaryTree **current,TREE_TYPE value)
{
/* 注意:这里为什么要用 **current 因为我们改变的是指针变量的值,所以传递的必须是指针的指针。在中序遍历函数中因不需要改变指针变量的值,所以传递的是指针。
 * 提示:如果要在函数中改变指针 用两种方法。第一种:函数形参用指针的指针。第二种 函数返回指针。
 */

/*    
 * 如果根结点为空,则新建结点
 * 否则 如果value>根结点->value 则把该值插入其右子树
 * 否则 如果value<根结点->value 则把该值插入其左子树
 */

    if (*current==NULL) {
        *current=(BinaryTree*)malloc(sizeof(BinaryTree));
        if((*current)!=NULL){
            (*current)->value=value;
            (*current)->left=NULL;
            (*current)->right=NULL;
        }
        else {
            printf("新建结点出错\n");
            exit(1);
        }

    }
    else if(value>(*current)->value){
        insert(&(*current)->right,value);
    }
    else if(value<(*current)->value){
        insert(&(*current)->left,value);
    }
    return ;
}        /* -----  end of function insert  ----- */


/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  inOrderTraverse
 *  Description:  中序遍历树
 *  Parameter: BinaryTree *root 指向二叉搜索树的根结点
 *  Create:15:11 2012-8-14
 *  Lastmodify:15:11 2012-8-14
 *  Author:      mang
 *  Version:     1.0
 * =====================================================================================
 */

    void
inOrderTraverse ( BinaryTree * root)
{

/*
 * 如果根结点为空什么也不做
 * 否则
 *      先中序遍历左子树
 *      再输出根结点的值
 *      再中序遍历右子树
 * 注意有的地方是这样写的:也是对的,但没有处理根结点为空的情况
 *  如果左子树不空则中序遍历左子树
 *  再输出根结点的值
 *      如果右子树不空则中序遍历右子树  
 */

    if(root==NULL){
        ;
    }
    else {
        inOrderTraverse(root->left);
        printf("%d ",root->value);
        inOrderTraverse(root->right);
    }
    return ;
}        /* -----  end of function inOrderTraverse  ----- */


BinaryTree *find(BinaryTree * tree,TREE_TYPE value );

/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  find
 *  Description:  
 *  Parameter:
 *  Create:
 *  Lastmodify:
 *  Author:      mang
 *  Version:     1.0
 * =====================================================================================
 */

    BinaryTree *   
find ( BinaryTree *current,TREE_TYPE value)
{
    if(current==NULL){
        return NULL;
    }
    else {
        if (value==current->value) {
            return current;   
        }
        else if(value>current->value){
            find(current->right,value);
        }
        else if (value<current->value) {
            find(current->left,value);
        }


    }
}        /* -----  end of function find  ----- */

makefile 源程序
main.exe:main.o binarySearchTree.o
    gcc -Wall -o main.exe main.o binarySearchTree.o

main.o:main.c
    gcc -Wall -o main.o -c main.c
binarySearchTree.o:binarySearchTree.c
    gcc -Wall -o binarySearchTree.o -c binarySearchTree.c

clean:
    del *.obj *.o *.exe




posted @ 2013-02-21 11:14  man1m  阅读(375)  评论(0编辑  收藏  举报