动态查找表之二叉排序树的查找、遍历、删除

一、动态查找表

      静态查找表只是对表中元素进行检索,返回成功或不成功!

      动态查找表的表结构是在查找的过程中动态生成的。若表中存在关键字等于给定的值key的记录,则返回成功;否则,插入关键字等于key的记录。

二、二叉排序树

      二叉排序树(BST)特点结点值的大小遵循“左<中<右”的排序,其中序遍历顺序必是严格递增的。

      2.1  根据给定的数组按照左<中<右”的排序原则建立二叉排序树。

      2.2  删除:设结点p为待删除结点,
              a.若结点p为叶子结点,若p的双亲节点parent的左子树为p,将parent的左子树设为空。p为parent的右子树同理可得

              b.若待删除结点p只有左子树,将左子树替换结点p;若p结点只有右子树同理可得

              c.若p的左右子树都存在,令s为其左子树,将左子树的最大值替换p,并调整s的子结点,保证除p外,中序遍历顺序不变。

具体代码如下(考虑了内存泄漏):

binarySortTree.h

template<typename T>
int getArrayLength(T &array) {
	return (sizeof(array) / sizeof(array[0]));
}
//设计数据结构,构造二叉树
typedef struct node {
	ElemType data;
	struct node *lchild, *rchild;
}*BST;
//插入元素
bool insertBST(BST &T, ElemType element) {
	if (T==NULL)
	{
		T = new node;
		T->data = element;
		T->lchild = T->rchild = NULL;
		return true;
	}
	if (T->data==element)   //元素的值不能和树中已有的值相等
	{
		return false;
	}
	if (element<T->data)
	{
		insertBST(T->lchild,element);
	}
	else
	{
		insertBST(T->rchild,element);
	}
}
//创建二叉排序树
void createBST(BST &T,ElemType array[],int len){   //Debug模式下,未初始化的栈内存上的指针全部填成0xcccccccc;
	T = NULL;
	for (int i = 0; i < len; i++)
	{
		insertBST(T,array[i]);
	}
}
void visit(ElemType elem) {
	cout << elem << "  ";
}
//中序遍历
void preOrderTraverse(BST &T) {
	if (T!=NULL)
	{
		preOrderTraverse(T->lchild);
		visit(T->data);
		preOrderTraverse(T->rchild);
	}
}
//释放内存
void relese(BST &T) {
	if (T==NULL)
	{
		return;
	}
	relese(T->lchild);
	relese(T->rchild);
	delete T;
}
//删除某个结点
bool deleteNode(BST &T, ElemType element) {
	if (T==NULL)
	{
		return false;
	}
	BST p,q,s,parent;
	p = T;
	while (p!=NULL)
	{
		if (p->data == element)  break;
		parent = p;
		p = (p->data < element) ? p->rchild: p->lchild;
	}
	if (p==NULL)
	{
		cout << "该二叉排序树中无您要删除的值!"<<endl;
		return false;
	}
	if ((p->lchild==NULL)&&(p->rchild==NULL))
	{
		//重置其父亲结点的左右子孩子
		if (parent->lchild != NULL&&parent->lchild->data==element)
		{
			parent->lchild = NULL;
		}
		if (parent->rchild!=NULL&&parent->rchild->data==element)
		{
			parent->rchild = NULL;
		}
		return true;
	}
	else if (p->lchild!=NULL&&p->rchild==NULL)
	{
		//要让p的左孩子接上
		s=p->lchild;
		p ->data= s->data;
		p->lchild = s->lchild;
		delete s;
		return true;
	}
	else if (p->lchild==NULL&&p->rchild!=NULL)
	{
		//要让p的右孩子接上
		s = p->rchild;
		p->data = s->data;
		p->rchild = s->rchild;
		delete s;
		return true;
	}
	else
	{
		q = p;
		s = p->lchild;
		while (s->rchild!=NULL)
		{
			q = s;
			s = s->rchild;
		}
		p->data = s->data;
		if (q!=p)
		{
			q->rchild = s->lchild;
		}
		else
		{
			q->lchild = s->lchild;
		}
		delete s;
		return true;
	}
} 

Search.cpp

int main()
{
	//排序二叉树
	ElemType c[] = {13,23,5,8,18,37,9};
	len = getArrayLength(c);
	BST T;
	cout << "根据数组:";
	for (int i = 0; i < len; i++)
	{
		visit(c[i]);
	}
	cout << endl;
	cout << "建立二叉排序树" << endl;
	createBST(T,c,len);
	cout << "中序遍历:";
	preOrderTraverse(T);
	cout << endl;
	cout << "请输入要删除的元素:";
	ElemType data;
	cin >> data;
	deleteNode(T, data);
	cout << "中序遍历:";
	preOrderTraverse(T);
	cout << endl;
	//释放内存
	relese(T);
	system("pause");
    return 0;
}

《动态查找表之二叉排序树的查找、遍历、删除》 完整项目代码Github下载地址:
点击打开链接,欢迎fork

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/fisherming/article/details/72964066
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞