[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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章