C 实现数据结构二叉查找树

本文详细介绍了二叉查找树的数据结构特点、如何建立空树、查找节点、获取最小最大节点、插入和删除节点的操作方法,并通过示例展示了二叉查找树的基本实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉查找树特点每个节点X,左子树的值都都小于X,右子树的值都大于X


二叉树声明

#ifndef _Tree_H

struct TreeNode;
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree;

SearchTree MakeEmpty(SearchTree T);
Position Find(int X, SearchTree T);
Position FindMin(SearchTree T);
Position FindMax(SearchTree T);
SearchTree Insert(int X, SearchTree T);
SearchTree Delete(int X, SearchTree T);
int Retrieve(Position P);

#endif

二叉树实现

/* 二叉查找树声明 */
struct TreeNode
{
	int Element;
	SearchTree Left;
	SearchTree Right;
};

/* 建立一棵空树 */
SearchTree MakeEmpty(SearchTree T)
{
	if(T != NULL)
	{
		MakeEmpty(T->Left);
		MakeEmpty(T->Right);
		free(T);
	}
	return NULL;
}

/* 查找某个节点 */
Position Find(int X, SearchTree T)
{
	if(T == NULL)
		return NULL;
	if(X < T->Element)
		return Find(X, T->Left);
	else if(X > T->Element)
		return Find(X, T->Right);
	else
		return T;
}

/* 查找二叉树最小节点 递归实现 */
Position FindMin(SearchTree T)
{
	if(T == NULL)
		return NULL;
	else if(T->Left == NULL)
		return T;
	else 
		return FindMin(T->Left);
}

/* 查找二叉树最大节点 非递归实现 */
Position FindMax(SearchTree T)
{
	if(T != NULL)
		while(T->Right != NULL)
			T = T->Right;
	
	return T;
}

/* 插入元素到二叉树 */
SearchTree Insert(int X, SearchTree T)
{
	if(T == NULL)
	{
		/* 创建并返回一个节点的树 */
		T = malloc(sizeof(struct TreeNode));
		if(T == NULL)
			fprintf(stderr, "Out of space!!!");
		else
		{
			T->Element = X;
			T->Left = T->Right = NULL;
		}
	}
	else if(X < T->Element)
		T->Left = Insert(X, T->Left);
	else if(X > T->Element)
		T->Right = Insert(X, T->Right);
	/* 如果X已经在树中就啥也不做 */
	
	return T;
}

/* 删除节点 */
SearchTree Delete(int X, SearchTree T)
{
	Position TmpCell;
	
	if(T == NULL)
		fprintf(stderr, "Element not found!!!");
	else if(X < T->Element)	// go to left
		T->Left = Delete(X, T->Left);
	else if(X > T->Element) // go to right
		T->Right = Delete(X, T->Right);
	else /* 找到删除的元素 */
	if(T->Left && T->Right) // 有2个子节点
	{
		/* 替换右子树中最小的节点 */
		TmpCell = FindMin(T->Right);
		T->Element = TmpCell->Element;
		T->Right = Delete(T->Element, T->Right);
	}
	else //有一个或没有子节点	
	{
		TmpCell = T;
		if(T->Left == NULL)
			T = T->Right;
		else if(T->Right == NULL)
			T= T->Left;
		free(TmpCell);
	}
	
	return T;
}

/* 取某个节点的值 */
int Retrieve(Position P)
{
	return P->Element;
}

二叉树测试

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

int main(void)
{
	SearchTree tree = NULL; // 不要忘了初始化
	tree = Insert(50, tree);
	ShowTree(tree);
	printf("\n");
	Insert(42, tree);
	ShowTree(tree);
	printf("\n");
	Insert(36, tree);
	Insert(48, tree);
	Insert(77, tree);
	Insert(3, tree);
	Insert(28, tree);
	Insert(98, tree);
	Insert(76, tree);
	Insert(1, tree);
	ShowTree(tree);
	printf("\n");
	Position p = Find(77, tree);
	if(p != NULL)
		printf("find %d ", Retrieve(p));
	else 
		printf("not found 77");
		
	Delete(48, tree);
	
	ShowTree(tree);
	printf("\n");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值