数据结构C_二叉搜索树
二叉搜索树概念
二叉搜索树又称二叉排序树,它或者是一颗空树,或者是具有以下性质的二叉树
· 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
· 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
· 它的左右子树也分别为二叉搜索树,
int a [ ] = {5,3,4,1,7,8,2,6,0,9};
二叉搜索树基本操作
BinarySearchTree.h
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <assert.h>
typedef int BSTDataType;
typedef struct BSTreeNode
{
struct BSTreeNode* _left;
struct BSTreeNode* _right;
BSTDataType _data;
}BSTreeNode;
//插入
int BSTreeInsert(BSTreeNode** tree, BSTDataType x);
//递归插入
int BSTreeInsert_R(BSTreeNode** tree, BSTDataType x);
//删除
int BSTreeRemove(BSTreeNode** tree, BSTDataType x);
//递归删除
int BSTreeRemove_R(BSTreeNode** tree, BSTDataType x);
//查找
BSTreeNode* BSTreeFind(BSTreeNode** tree, BSTDataType x);
//递归查找
BSTreeNode* BSTreeFind_R(BSTreeNode** tree, BSTDataType x);
//中序遍历
void BSTreeInOrder(BSTreeNode** tree);
BinarySearchTree.c
#include"BinarySearchTree.h"
//申请节点
BSTreeNode * BuyBSTreeNode(BSTDataType x)
{
BSTreeNode * node = (BSTreeNode*)malloc(sizeof(BSTreeNode));
node->_data = x;
node->_left = NULL;
node->_right = NULL;
return node;
}
//插入
int BSTreeInsert(BSTreeNode** tree, BSTDataType x)
{
BSTreeNode* cur;
BSTreeNode* root = *tree;
if (root == NULL)
{
*tree = BuyBSTreeNode(x);
return 1;
}
root = *tree;
cur = root;
while (root)
{
if (root->_data > x)
{
cur = root;
root = root->_left;
}
else if (root->_data < x)
{
root = root->_right;
}
else
{
return 0;
}
}
if (cur->_data>x)
cur->_left = BuyBSTreeNode(x);
else
cur->_right = BuyBSTreeNode(x);
return 1;
}
//递归插入
int BSTreeInsert_R(BSTreeNode** tree, BSTDataType x)
{
assert(tree);
if (*tree = NULL)
{
//二级指针解引用表示要查入位置的地址
*tree = BuyBSTreeNode(x);
return 1;
}
if ((*tree)->_data > x)
return BSTreeInsert_R(&(*tree)->_left, x);
else if ((*tree)->_data < x)
return BSTreeInsert_R(&(*tree)->_right, x);
else
return 0;
}
//删除
int BSTreeRemove(BSTreeNode** tree, BSTDataType x)
{
BSTreeNode* parent;
BSTreeNode* cur;
cur = *tree;
parent = NULL;
while (cur)
{
if (cur->_data > x)
{
parent = cur;
cur = cur->_left;
}
else if (cur->_data < x)
{
parent = cur;
cur = cur->_right;
}
else
{
//左为空或者右为空
if (!cur->_left || !cur->_right)
{
if (parent == NULL)
{
if (cur->_left == NULL)
*tree = cur->_right;
else
*tree = cur->_left;
break;
}
if (parent->_left == cur)
{
if (cur->_left == NULL)
parent->_left = cur->_right;
else
parent->_left = cur->_left;
break;
}
else
{
if (cur->_left == NULL)
parent->_right = cur->_right;
else
parent->_right = cur->_left;
break;
}
}
//左右都不为空
else
{
//不能使用parent去充当临时指针
BSTreeNode* ret;
ret = cur->_right;
while (ret->_left)
ret = ret->_left;
cur->_data = ret->_data;
BSTreeRemove(&cur->_right, ret->_right);
}
}
}
if (cur == NULL)
return 0;
free(cur);
cur = NULL;
return 1;
}
//递归删除
int BSTreeRemove_R(BSTreeNode** tree, BSTDataType x)
{
BSTreeNode* parent;
BSTreeNode* cur;
assert(tree);
cur = *tree;
parent = NULL;
if (cur == NULL)
return 0;
if (cur->_data == x)
{
if (cur->_left == NULL)
*tree = cur->_right;
else if (cur->_right == NULL)
*tree = cur->_left;
else
{
parent = cur->_right;
while (parent->_left)
parent = parent->_left;
cur->_data = parent->_data;
return BSTreeRemove_R(&cur->_right, cur->_data);
}
free(cur);
cur = NULL;
return 1;
}
else if (cur->_data > x)
return BSTreeRemove_R(&cur->_left, x);
else
return BSTreeRemove_R(&cur->_right, x);
return 0;
}
//查找
BSTreeNode* BSTreeFind(BSTreeNode** tree, BSTDataType x)
{
BSTreeNode* node = *tree;
while (node)
{
if (node->_data > x)
node = node->_right;
else if (node->_data < x)
node = node->_left;
else
return node;
}
return NULL;
}
//递归查找
BSTreeNode* BSTreeFind_R(BSTreeNode** tree, BSTDataType x)
{
if (*tree == NULL)
return NULL;
if ((*tree)->_data > x)
return BSTreeFind_R(&(*tree)->_left, x);
if ((*tree)->_data < x)
return BSTreeFind_R(&(*tree)->_right, x);
else
return *tree;
}
//中序遍历
void BSTreeInOrder(BSTreeNode** tree)
{
if ((*tree) == NULL)
return;
BSTreeInOrder(&(*tree)->_left);
printf("%d ", (*tree)->_data);
BSTreeInOrder(&(*tree)->_right);
}
test.c
#include"BinarySearchTree.h"
void TestBSTree()
{
//BSTreeNode* tree = NULL;
//BSTreeInsert(&tree, 4);
//BSTreeInsert(&tree, 2);
//BSTreeInsert(&tree, 1);
//BSTreeInsert(&tree, 3);
//BSTreeInsert(&tree, 2);
//const BSTreeNode* node = BSTreeFind(tree, 2);
//printf("Find 2? %d\n", node->_data);
int a[] = {5,3,4,1,7,8,2,6,0,9};
BSTreeNode* tree = NULL;
for (int i = 0; i < sizeof(a)/sizeof(a[0]); ++i)
{
BSTreeInsert(&tree, a[i]);
}
BSTreeInOrder(&tree);
printf("\n");
BSTreeRemove(&tree, 4);
BSTreeRemove(&tree, 8);
BSTreeRemove(&tree, 3);
BSTreeRemove(&tree, 7);
BSTreeRemove(&tree, 5);
BSTreeInOrder(&tree);
printf("\n");
BSTreeRemove(&tree, 0);
BSTreeRemove(&tree, 1);
BSTreeRemove(&tree, 2);
BSTreeRemove(&tree, 3);
BSTreeRemove(&tree, 4);
BSTreeRemove(&tree, 5);
BSTreeRemove(&tree, 6);
BSTreeRemove(&tree, 7);
BSTreeRemove(&tree, 8);
BSTreeRemove(&tree, 9);
BSTreeInOrder(&tree);
printf("\n");
}
int main()
{
TestBSTree();
system("pause");
return 0;
}