[Sonia] Implementation of a Binary Tree Sort in C

[First Accepted Time: 2013/02/26]

1. Basic binary tree structure definition

//File name: binary_sort.h

#ifndef _BINARY_SORT_
#define _BINARY_SORT_

#include <stdio.h>
#include <stdlib.h>

struct binary_tree{
	int data;
	binary_tree* left;
	binary_tree* right;
};

int read_data(char * file_name, int data[], int* length);
int in_traversal(struct binary_tree* b_tree);
struct binary_tree* create_bin_tree(int data[], int length);
int free_tree(struct binary_tree* b_tree);

#endif

 

2. Implementation of the binary tree structure

//File name: binary_sort.cpp

#include "binary_sort.h"

int read_data(char * file_name, int data[], int* length)
{
	int temp = 0;
	(*length) = 0;
	FILE* fp = NULL;

	if((fp = fopen(file_name, "r")) == NULL)
	{
		printf("File \"%s\" does not exist.", file_name);
		exit(-1);
	}

	while(!(feof(fp)))
	{
		(*length)++;
		fscanf(fp, "%d", &data[(*length) - 1]);
	}

	fclose(fp);
	return 0;
}

struct binary_tree* create_bin_tree(int data[], int length)
{
	int i = 0;
	int flag = 0;
	struct binary_tree* temp = NULL;
	struct binary_tree* p_temp = NULL;
	struct binary_tree* b_tree = NULL;

	for(i = 0; i < length; i++)
	{
		flag = 0;
		p_temp = b_tree;

		while(p_temp != NULL)
		{
			if(data[i] < p_temp->data)  
			{
				flag = 1;
				if(p_temp->left != NULL)   p_temp = p_temp->left;
				else break;
			}
			else 
			{
				flag = 2;
				if(p_temp->right != NULL)   p_temp = p_temp->right;
				else break;
			}
		}   //找到插入的位置

		temp = (struct binary_tree *) malloc(sizeof(struct binary_tree));
		if(temp == NULL)
		{
			printf("Malloc error.");
			exit(-1);
		}
		temp->left = temp->right = NULL;
		temp->data = data[i];    //新建待插入的节点
		

		if(i == 0)   b_tree =p_temp = temp;    //若i=0,则直接赋值
		else
		{
			if(flag == 1)   p_temp->left = temp;    //若flag=1,将节点插入到左子树
			else if(flag == 2) p_temp->right = temp;    //若flag=2,将节点插入到右子树
		}
	}

	return b_tree;
}


int in_traversal(struct binary_tree* b_tree)
{
	struct binary_tree* p_temp = b_tree;	

	if(p_temp != NULL)
	{
		in_traversal(p_temp->left);
		printf("%d   ", p_temp->data);
		in_traversal(p_temp->right);
	}

	return 0;
}

int free_tree(struct binary_tree* b_tree)
{

	if(b_tree != NULL)
	{
		free_tree(b_tree->left);
		free_tree(b_tree->right);
		free(b_tree);
	}

	return 0;
}


3. The test bench

// File name: main.cpp
 
#include "binary_sort.h"
#define MAX_LEN 1000

int main()
{
	int length = 0;
	int data[MAX_LEN] = {0};
	char file_name[100] = "data.txt";
	struct binary_tree* b_tree = NULL;

	printf("Please enter the file name of the source data:  ");
	scanf("%s", file_name);    //输入数据文件名

	read_data( file_name, data, &length);    //读取数据
	b_tree = create_bin_tree(data, length);    //创建二叉排序树
	printf("The right order of data is:\n");
	in_traversal(b_tree);    //中序遍历打印二叉排序树

	free_tree(b_tree);    //释放二叉树的内存空间
	return 0;
}


 

This program is well done by Sonia. It's another milestone in learning programming.

Congratulations and add oil ! 

发布了28 篇原创文章 · 获赞 4 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章