二叉查找树(Binary Search Tree)的实现

二叉查找树又称二叉排序树(Binary Sort Tree)。使二叉树成为二叉查找树的性质是,对于树中的每个节点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值。

例如如下图所示的二叉树即为二叉查找树


二叉查找树的声明tree.h

typedef int ElementType;

#ifndef TREE_H
#define TREE_H

struct TreeNode
{
	ElementType Element;
	struct TreeNode *Left;
	struct TreeNode *Right;
};
typedef struct TreeNode *SearchTree;
typedef struct TreeNode *Position;

SearchTree MakeEmpty(SearchTree T);
Position Find(ElementType X, SearchTree T);
Position FindMin(SearchTree T);
Position FindMax(SearchTree T);
SearchTree Insert(ElementType X, SearchTree T);
SearchTree Delete(ElementType X, SearchTree T);

#endif
二叉查找树的实现tree.c
#include "fatal.h"
#include "tree.h"

SearchTree MakeEmpty(SearchTree T)
{
	if(T != NULL)
	{
		MakeEmpty(T->Left);
		MakeEmpty(T->Right);
		free(T);
	}
	return NULL;
}

Position Find(ElementType X, SearchTree T)
{
	if(T == NULL)
		return T;
	else 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(ElementType X, SearchTree T)
{
	if(T == NULL)
	{
		T = (Position)malloc(sizeof(struct TreeNode));
		if(T == NULL)
			FatalError("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);
	return T;
}

SearchTree Delete(ElementType X, SearchTree T)
{
	Position TmpCell;

	if(T == NULL)
		return NULL;
	else if(X < T->Element)
		T->Left = Delete(X, T->Left);
	else if(X > T->Element)
		T->Right = Delete(X, T->Right);
	else if(T->Right && T->Left)
	{
		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;
}
测试二叉查找树testtree.c
#include <stdio.h>
#include "tree.h"

#define N 8

int main(void)
{
	int arr[N] = { 6, 4, 3, 5, 7, 9, 10, 8 };
	int i, e;
	SearchTree T;
	Position P;

	T = MakeEmpty(NULL);
	for(i = 0; i < N; ++i)
		T = Insert(arr[i], T);
	P = FindMin(T);
	printf("Min: %d\n", P->Element);
	P = FindMax(T);
	printf("Max: %d\n", P->Element);
	T = Delete(6, T);
	i = 0;
	while(T)
		T = Delete(arr[i++], T);
	printf("%d\n", T == NULL);
	return 0;
}
运行结果:


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值