1. 程式人生 > >Linux學習筆記(演算法與資料結構)之 二叉搜尋樹程式碼(C語言)

Linux學習筆記(演算法與資料結構)之 二叉搜尋樹程式碼(C語言)

1、程式碼在VS2010的C++編譯器中編譯通過,可能有極少部分語法不符合C99標準;bool型別無法使用,用int代替

2、由於VS配置問題,沒有分.c和.h檔案書寫;如果要分,最好將Create_Node和Destory_Node加上static關鍵字修飾,他們只會在所屬的.c檔案中使用。

3、用C實現需要用到二級指標...比較繁瑣,C++中可以用引用代替。

4、國慶放假了,等會趕火車回家...實在沒想到二叉搜尋樹寫了一個下午...所以二叉搜尋樹的大小size和高度heigth沒有加入到程式碼實現中;批量刪除某個數的功能也沒有實現;釋放記憶體的Deinit也沒有實現...

// Cpp_Study.cpp : 定義控制檯應用程式的入口點。
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>

/*
 *******************************************************************
 結構體:表示二叉搜尋樹上的一個節點,包含3個成員變數
 *******************************************************************
*/
typedef struct BsTree_Node {
	int data;				//該節點儲存的資料
	BsTree_Node* left;		//該節點的左子節點
	BsTree_Node* right;		//該節點的左子節點
}	BSTREE_NODE;

/*
 *******************************************************************
 結構體:表示二叉搜尋樹(或者說二叉搜尋樹的第0層)
 *******************************************************************
*/
typedef struct BsTree {
	BSTREE_NODE* root;		//記錄樹的根節點
}	BSTREE;


/*
 *******************************************************************
 函式功能:根據引數data建立新的節點儲存data的值,返回新建立的節點的地址
 *******************************************************************
*/
static BSTREE_NODE* Create_Node(int data)
{
	BSTREE_NODE* bstree_node = (BSTREE_NODE*)malloc(sizeof(BSTREE_NODE));	//為新節點申請空間
	bstree_node->data = data;		//賦初值
	bstree_node->left = NULL;
	bstree_node->right =NULL;
	return bstree_node;
}

/*
 *******************************************************************
 函式功能:在以一個以root為根的子樹中,插入新節點new_node
 形參BSTREE_NODE** root,代表儲存在根節點中儲存左子節點地址的記憶體空間的地址
 *******************************************************************
*/
static void Insert(BSTREE_NODE* new_node,BSTREE_NODE** root)
{
	if (*root == NULL)			//如果要插入的地方本身為空,則插在此處;並將父親節點的左節點指標指向new_node
	{
		*root = new_node;
		return ;
	}
	else if (new_node != NULL)		
	{
		if (new_node->data <= (*root)->data)	//小於等於父節點的值則往左走
			Insert(new_node,&(*root)->left);
		else
			Insert(new_node,&(*root)->right);	//大於父節點的值則往左走
	}
}

/*
 *******************************************************************
 函式功能:在以一個以root的子節點為根的子樹中,尋找data值,返回找到的data值所在的節點地址
 形參BSTREE_NODE** root,代表儲存在根節點中儲存左子節點地址的記憶體空間的地址
 *******************************************************************
*/
static BSTREE_NODE** Find(int data,BSTREE_NODE** root)
{
	if ((*root) == NULL)		//如果父親節點指向正在搜尋的節點的指標為空,代表該指標不存在
								//即已經搜尋到最後一層,則返回NULL代表未找到
		return NULL;
	if ((*root)->data > data)	//要尋找的值小於該節點的值,左走
		return Find(data,&(*root)->left);
	if ((*root)->data < data)	//要尋找的值大於該節點的值,右走
		return Find(data,&(*root)->right);
	return root;				//要尋找的值等於該節點的值,返回該節點地址
}

/*
 *******************************************************************
 函式功能:中序遍歷二叉搜尋樹
 *******************************************************************
*/
static void traval(BSTREE_NODE* bstree_node)
{
	if (bstree_node == NULL) return ;
	traval(bstree_node->left);
	printf("%d ",bstree_node->data);
	traval(bstree_node->right);
}

/*
 *******************************************************************
 函式功能:初始化一個二叉搜尋樹,主要是賦值
 *******************************************************************
*/
void BsTree_Init(BSTREE* bstree)
{
	bstree->root = NULL;
	bstree->root = 0;
}

/*
 *******************************************************************
 函式功能:在二叉搜尋樹中,插入新值data。通過呼叫內部介面函式實現
 *******************************************************************
*/
void BsTree_Insert(BSTREE* bstree,int data) {
	Insert(Create_Node(data),&bstree->root);
}	

/*
 *******************************************************************
 函式功能:在二叉搜尋樹中,刪除一個值為data的節點
 需要呼叫內部介面函式find尋找該值所在節點的地址
 找到之後,將該節點的左子樹加入到右子樹中,用右子樹根節點代替該節點即可
 *******************************************************************
*/
void Bstree_erase(BSTREE* bstree,int data)
{
	BSTREE_NODE** root = Find(data,&bstree->root);
	if (! *root) return ;
	Insert((*root)->left,&(*root)->right);
	BSTREE_NODE* tmp = (*root);
	(*root) = (*root)->right;
	(*root)->left = NULL;
	free(tmp);
}

/*
 *******************************************************************
 函式功能:將一個數改為另一個數
 *******************************************************************
*/
void BsTree_update(BSTREE* bstree,int oldData,int newData)
{
	BSTREE_NODE ** tmp = Find(oldData,&(bstree->root));
	if (tmp == NULL) return ;
	(*tmp)->data = newData;
}

/*
 *******************************************************************
 函式功能:查詢一個樹是否存在於二叉搜尋樹中
 *******************************************************************
*/
void BsTree_exist(BSTREE* bstree,int data)
{
	BSTREE_NODE** tmp = Find(data,&(bstree->root));
	if (tmp != NULL)
		printf("\n%d exist!\n",data);
	else printf("\n%d do not exist!\n",data);
}
/*
 *******************************************************************
 函式功能:中序遍歷二叉樹,呼叫內部介面函式travel
 *******************************************************************
*/
void BsTree_traval(BSTREE* bstree)
{
	printf("\n");
	traval(bstree->root);
	printf("\n");
}
/*
 *******************************************************************
 函式功能:獲取二叉搜尋樹大小,程式還未實現
 *******************************************************************
*/
int BsTree_Size(BSTREE* bstree);
/*
 *******************************************************************
 函式功能:獲取二叉搜尋樹高度,程式還未實現
 *******************************************************************
*/
int BsTree_Height(BSTREE* bstree);


void main(void){
	BSTREE bstree;
	BsTree_Init(&bstree);
	while(1)
	{
		printf("\nplease input the number of operation:\n1.Insert 2.update 3.traval 4.exist:");
		int a,b,c;
		scanf("%d",&a);
		if (a == 1)
		{
			scanf("%d",&b);
			BsTree_Insert(&bstree,b);
		}
		else if (a == 2)
		{
			scanf("%d%d",&b,&c);
			BsTree_update(&bstree,b,c);
		}
		else if (a == 3)
		{
			BsTree_traval(&bstree);
		}
		else if (a == 4)
		{
			scanf("%d",&b);
			BsTree_exist(&bstree,b);
		}
		
	}


}