【数据结构】搜索二叉树的实现

BinarySortTree.h

#ifndef __BINARYSTREE_H__
#define __BINARYSTREE_H__

#include <stdio.h>
#include <malloc.h>
#include <assert.h>
#include <stdlib.h>



typedef int BSDataType;


typedef struct BSTreeNode
{
	struct BSTreeNode* _left;
	struct BSTreeNode* _right;
	BSDataType _key;
}BSTreeNode;

int BSTreeInsert(BSTreeNode** ppTree, BSDataType x);
int BSTreeRemove(BSTreeNode** ppTree, BSDataType x);
BSTreeNode* BSTreeFind(BSTreeNode** ppTree, BSDataType x);
void BSTreeInOrder(BSTreeNode** ppTree);
void TestBSTreeR();
void TestBSTree();

#endif

BinarySortTree.c

#define  _CRT_SECURE_NO_WARNINGS 0

#include "BinarySTree.h"

BSTreeNode* BuyBSTreeNode(BSDataType x)
{
	BSTreeNode* node = (BSTreeNode*)malloc(sizeof(BSTreeNode));
	node->_left = NULL;
	node->_right = NULL;
	node->_key = x;
	return node;
}

int BSTreeInsert(BSTreeNode** ppTree, BSDataType x)
{
	assert(ppTree);
	if (*ppTree == NULL)
	{
		*ppTree = BuyBSTreeNode(x);
		return 1;
	}
	BSTreeNode* cur = *ppTree;
	BSTreeNode* parent = NULL;
	while (cur)
	{
		if (cur->_key > x)
		{
			parent = cur;
			cur = cur->_left;
		}
		else if (cur->_key < x)
		{
			parent = cur;
			cur = cur->_right;
		}
		else
		{
			return 0;
		}
	}
	cur = BuyBSTreeNode(x);
	if (parent->_key < x)
	{
		parent->_right = BuyBSTreeNode(x);
	}
	else
	{
		parent->_left = BuyBSTreeNode(x);
	}

	return 1;
}

int BSTreeRemove(BSTreeNode** ppTree, BSDataType x)
{
	BSTreeNode* cur = *ppTree;
	BSTreeNode* parent = NULL;
	while (cur)
	{
		if (cur->_key < x)
		{
			parent = cur;
			cur = cur->_right;
		}
		else if (cur->_key > x)
		{
			parent = cur;
			cur = cur->_left;
		}
		else
		{
			if (cur->_left == NULL)
			{
				if (parent == NULL)
				{
					*ppTree = cur->_right;
				}
				else
				{
					if (cur == parent->_left)
					{
						parent->_left = cur->_right;
					}
					else
					{
						parent->_right = cur->_right;
					}
				}
			}
			else if (cur->_right == NULL)
			{
				if (parent == NULL)
				{
					*ppTree = cur->_left;
				}
				else
				{
					if (cur == parent->_left)
					{
						parent->_left = cur->_left;
					}
					else
					{
						parent->_right = cur->_left;
					}
				}
			}
			//左右都不为空(要删除节点右树最左边的是替代节点)
			else
			{
				BSTreeNode* replace = cur->_right;
				while (replace->_left)
				{
					replace = replace->_left;
				}

				cur->_key = replace->_key;

				return BSTreeRemove(&cur->_right, replace->_key);
			}

			free(cur);
			return 1;
		}
	}

	return 0;
}

BSTreeNode* BSTreeFind(BSTreeNode** ppTree, BSDataType x)
{
	BSTreeNode* cur = *ppTree;
	while (cur)
	{
		if (cur->_key < x)
		{
			cur = cur->_right;
		}
		else if (cur->_key > x)
		{
			cur = cur->_left;
		}
		else
		{
			return cur;
		}
	}

	return NULL;
}

void BSTreeInOrder(BSTreeNode** ppTree)
{
	if (*ppTree == NULL)
	{
		return;
	}

	BSTreeInOrder(&(*ppTree)->_left);
	printf("%d ", (*ppTree)->_key);
	BSTreeInOrder(&(*ppTree)->_right);
}

void TestBSTree()
{
	int i = 0;
	BSTreeNode* pTree = NULL;
	int a[] = { 5, 3, 4, 1, 7, 8, 2, 6, 0, 9 };
	for (; i < sizeof(a) / sizeof(int); ++i)
	{
		BSTreeInsert(&pTree, a[i]);
	}
	BSTreeInOrder(&pTree);
	printf("\n");

	BSTreeRemove(&pTree, 2);
	BSTreeRemove(&pTree, 1);
	BSTreeRemove(&pTree, 8);
	BSTreeRemove(&pTree, 5);

	BSTreeInOrder(&pTree);
	printf("\n");

	//BSTreeRemove(&pTree, 6);
	//BSTreeRemove(&pTree, 5);


	/*BSTreeRemove(&ppTree, 0);
	BSTreeInOrder(&ppTree);
	printf("\n");

	BSTreeRemove(&ppTree, 1);
	BSTreeInOrder(&ppTree);
	printf("\n");

	BSTreeRemove(&ppTree, 2);
	BSTreeInOrder(&ppTree);
	printf("\n");

	BSTreeRemove(&ppTree, 3);
	BSTreeInOrder(&ppTree);
	printf("\n");

	BSTreeRemove(&ppTree, 4);
	BSTreeInOrder(&ppTree);
	printf("\n");

	BSTreeRemove(&ppTree, 5);
	BSTreeInOrder(&ppTree);
	printf("\n");

	BSTreeRemove(&ppTree, 6);
	BSTreeInOrder(&ppTree);
	printf("\n");

	BSTreeRemove(&ppTree, 7);
	BSTreeInOrder(&ppTree);
	printf("\n");

	BSTreeRemove(&ppTree, 8);
	BSTreeInOrder(&ppTree);
	printf("\n");

	BSTreeRemove(&ppTree, 9);
	BSTreeInOrder(&ppTree);
	printf("\n");

	BSTreeRemove(&ppTree, 10);
	BSTreeInOrder(&ppTree);
	printf("\n");*/

	//BSTreeInOrder(&ppTree);
	//printf("\n");
}

int BSTreeInsertR(BSTreeNode** ppTree, BSDataType x)
{
	if (*ppTree == NULL)
	{
		*ppTree = BuyBSTreeNode(x);
		return 1;
	}

	if ((*ppTree)->_key > x)
		return BSTreeInsertR(&(*ppTree)->_left, x);
	else if ((*ppTree)->_key < x)
		return BSTreeInsertR(&(*ppTree)->_right, x);
	else
		return 0;
}

int BSTreeRemoveR(BSTreeNode** ppTree, BSDataType x)
{
	if (*ppTree == NULL)
	{
		return -1;
	}

	if ((*ppTree)->_key < x)
	{
		return BSTreeRemoveR(&((*ppTree)->_right), x);
	}
	else if ((*ppTree)->_key > x)
	{
		return BSTreeRemoveR(&((*ppTree)->_left), x);
	}
	else
	{
		BSTreeNode* del = *ppTree;

		if ((*ppTree)->_left == NULL)
		{
			*ppTree = (*ppTree)->_right;

			free(del);
		}
		else if ((*ppTree)->_right == NULL)
		{
			*ppTree = (*ppTree)->_left;

			free(del);
		}
		else
		{
			BSTreeNode* replace = (*ppTree)->_right;
			while (replace->_left)
			{
				replace = replace->_left;
			}

			(*ppTree)->_key = replace->_key;

			return BSTreeRemoveR(&(*ppTree)->_right, replace->_key);
		}
	}

	return 1;
}

BSTreeNode* BSTreeFindR(BSTreeNode** ppTree, BSDataType x)
{
	if (*ppTree == NULL)
	{
		return NULL;
	}

	if ((*ppTree)->_key > x)
	{
		return BSTreeFindR(&((*ppTree)->_left), x);
	}
	else if ((*ppTree)->_key < x)
	{
		return BSTreeFindR(&((*ppTree)->_right), x);
	}
	else
	{
		return *ppTree;
	}
}

void TestBSTreeR()
{
	int i = 0;
	BSTreeNode* pTree = NULL;
	int a[] = { 5, 3, 4, 1, 7, 8, 2, 6, 0, 9 };
	for (; i < sizeof(a) / sizeof(int); ++i)
	{
		BSTreeInsertR(&pTree, a[i]);
	}

	/*BSTreeRemoveR(&pTree, 0);
	BSTreeRemoveR(&pTree, 1);
	BSTreeRemoveR(&pTree, 2);	BSTreeRemoveR(&pTree, 3);
	BSTreeRemoveR(&pTree, 4);
	BSTreeRemoveR(&pTree, 5);
	BSTreeRemoveR(&pTree, 6);
	BSTreeRemoveR(&pTree, 7);
	BSTreeRemoveR(&pTree, 8);
	BSTreeRemoveR(&pTree, 9);
	BSTreeRemoveR(&pTree, 10);*/

	BSTreeInOrder(&pTree);
	printf("\n");
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值