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);
		}
		
	}


}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值