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