二叉搜索(排序)树的算法实现(C++描述)

定义 

二叉搜索树又称二叉查找树、二叉排序树(Binary Sort Tree)。它是一颗空树或是满足下列性质的二叉树:

1)若左子树不空,则左子树上所有节点的值均小于或等于它的根节点的值;

2)若右子树不空,则右子树上所有节点的值均大于或等于它的根节点的值;

3)左、右子树也分别为二叉排序树。
 

数据结构

二叉树一般采用链式存储方式:每个结点包含两个指针域,指向两个孩子结点,还包含一个数据域,存储结点信息。
typedef struct _BNode 
{
	int data;
	struct _BNode *lchild, *rchild;
}BNode,*BTree;

二叉搜索树插入节点

将要插入的结点 e,与节点 root 节点进行比较,若小于则去到左子树进行比较,若大于则去到右子树进行比较,重复以上
操作直到找到一个空位置用于放置该新节点
bool InsertTree(BTree &BT, BNode *node)
{

	BNode *tmp = BT;
	BNode *parent = NULL;
	if (!node) return false;
	node->lchild = NULL;
	node->rchild = NULL;
	//如果根结点不存在
	if (BT == NULL)
	{
		BT = node;
		return true;
	}
	else
	{
		tmp = BT;
	}

	while (tmp != NULL)
	{
		parent = tmp;
		if (isLess(node->data, tmp->data))
			tmp = tmp->lchild;
		else
			tmp = tmp->rchild;
	}

	if (isLess(node->data, parent->data))
		parent->lchild = node;
	else
		parent->rchild = node;

	return true;

}

二叉搜索树删除节点

将要删除的节点的值,与节点 root 节点进行比较,若小于则去到左子树进行比较,若大于则去到右子树进行比较,重复以
上操作直到找到一个节点的值等于删除的值,则将此节点删除。删除时有 4 中情况须分别处理:

//删除BT中值为val的结点 并将删除后的二叉搜索树
BTree DeleteTree(BTree &BT,int val)
{
	if (!BT) return NULL;
	if (BT->data == val)
	{
		if (BT->lchild == NULL && BT->rchild == NULL) return NULL;
		if (BT->lchild != NULL && BT->rchild == NULL) return BT->lchild;
		if (BT->lchild == NULL && BT->rchild != NULL) return BT->rchild;
		if (BT->lchild != NULL && BT->rchild != NULL)
		{
			
		   int tmp= findMax(BT->lchild);//找出左子树中最大的结点值
		   BT->data = tmp;
		   BT->lchild = DeleteTree(BT->lchild, tmp);
		   return BT;
		}
 	}

	if (val < BT->data)
	{
		BT->lchild = DeleteTree(BT->lchild, val);
		return BT;
	}

	if (val > BT->data)
	{
		BT->rchild = DeleteTree(BT->rchild, val);
		return BT;
	}	

}

二叉搜索树搜索

BNode * QueryTree(BTree BT, int val)
{
	if (!BT) return NULL;	
	if (BT->data == val)
		return BT;
	else if (isLess(val, BT->data))
		return QueryTree(BT->lchild, val);
	else
		return QueryTree(BT->rchild, val);
}

二叉树的遍历

二叉树的遍历是指从根结点出发,按照某种次序依次访问所有结点,使得每个结点被当且访问一次。共分为四种方式:
前序遍历 - 先访问根节点,然后前序遍历左子树,再前序遍历右子树
void PrePrintTree(BTree BT)
{
	if (!BT) return;
	cout << BT->data << " ";
	PrePrintTree(BT->lchild);
	PrePrintTree(BT->rchild);
}

程序清单

// 二叉搜索树.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//Author:See QQ3492625357
//源码为本人手写可能有误,若有不当之处欢迎指正

#include <iostream>

#define isLess(a, b) (a<b)

using namespace std;

typedef struct _BNode 
{
	int data;
	struct _BNode *lchild, *rchild;
}BNode,*BTree;

//数据的插入
bool InsertTree(BTree &BT, BNode *node)
{

	BNode *tmp = BT;
	BNode *parent = NULL;
	if (!node) return false;
	node->lchild = NULL;
	node->rchild = NULL;
	//如果根结点不存在
	if (BT == NULL)
	{
		BT = node;
		return true;
	}
	else
	{
		tmp = BT;
	}

	while (tmp != NULL)
	{
		parent = tmp;
		if (isLess(node->data, tmp->data))
			tmp = tmp->lchild;
		else
			tmp = tmp->rchild;
	}

	if (isLess(node->data, parent->data))
		parent->lchild = node;
	else
		parent->rchild = node;

	return true;

}

//返回二叉搜索树中的最大值
int findMax(BTree BT)
{
	if (!BT) return NULL;
	if (BT->rchild==NULL)
	{
		return BT->data;
	}
	else
	{
		return findMax(BT->rchild);
	}
}
//删除BT中值为val的结点 并将删除后的二叉搜索树
BTree DeleteTree(BTree &BT,int val)
{
	if (!BT) return NULL;
	if (BT->data == val)
	{
		if (BT->lchild == NULL && BT->rchild == NULL) return NULL;
		if (BT->lchild != NULL && BT->rchild == NULL) return BT->lchild;
		if (BT->lchild == NULL && BT->rchild != NULL) return BT->rchild;
		if (BT->lchild != NULL && BT->rchild != NULL)
		{
			
		   int tmp= findMax(BT->lchild);
		   BT->data = tmp;
		   BT->lchild = DeleteTree(BT->lchild, tmp);
		   return BT;
		}
 	}

	if (val < BT->data)
	{
		BT->lchild = DeleteTree(BT->lchild, val);
		return BT;
	}

	if (val > BT->data)
	{
		BT->rchild = DeleteTree(BT->rchild, val);
		return BT;
	}	

}

//查找结点
BNode * QueryTree(BTree BT, int val)
{
	if (!BT) return NULL;	
	if (BT->data == val)
		return BT;
	else if (isLess(val, BT->data))
		return QueryTree(BT->lchild, val);
	else
		return QueryTree(BT->rchild, val);
}

//前序遍历
void PrePrintTree(BTree BT)
{
	if (!BT) return;
	cout << BT->data << " ";
	PrePrintTree(BT->lchild);
	PrePrintTree(BT->rchild);
}

//中序遍历
void InOderPrintTree(BTree BT)
{
	if (!BT) return;
	InOderPrintTree(BT->lchild);
	cout << BT->data << " ";
	InOderPrintTree(BT->rchild);
}


//后序遍历
void PostPrintTree(BTree BT)
{
	if (!BT) return;
	PostPrintTree(BT->lchild);
	PostPrintTree(BT->rchild);
	cout << BT->data << " ";
}

int main()
{ 
	int arr[] = { 19,7,11,15,5,21,25,26,61,99 };
	BTree BT=NULL;
	
	//将arr数据插入BT中
	for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
	{
		BNode *node = new BNode;
		node->data = arr[i];
		InsertTree(BT, node);
	}
	//遍历BT
	PrePrintTree(BT);
	cout << endl;

	cout << "查找元素15" << endl;
	BNode *node = QueryTree(BT, 15);
	cout <<"查询出的结果是:"<<node->data << endl;

	//删除元素99
	BTree BT2 = DeleteTree(BT, 99);
	PrePrintTree(BT2);
	cout << endl;
}

猜你喜欢

转载自blog.csdn.net/weixin_40582034/article/details/119045096