动态查找表之二叉排序树(BST)的 创建、查找、插入与删除

原创 2015年07月06日 23:49:53

动态查找表之二叉排序树(BST)的 创建、查找、插入与删除

删除结点的相关操作(左右子树均为非空的删除结点的方法):


算法分析:


下面以实例来说明二叉排序树的创建、查找、插入和删除等相关操作;

如输入关键字序列(452437125493),然后对其进行相应的操作,程序如下:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef struct BiTNode
{
	int value;
	struct BiTNode *lchild,*rchild;
}*BiTree;

bool LT(int a,int b)  //LessThan小于
{
	if(a<b)
		return true;
	else
		return false;
}
/*
在根指针root所指向的二叉排序树中递归地查找其关键字等于data的数据元素,若查找成功,则指针p指向该数据元素结点,并返回true,
否则指针p指向查找路径上访问的最后一个结点并返回false指针,指针f指向root的双亲,其初始调用值NULL
*/
bool SearchBST(BiTree root,int data,BiTree f,BiTree &p)
{
	if(!root)
	{
		p=f;
		return false;
	}
	else if(data == root->value)   //查找成功
	{
		p=root;
		return true;
	}
	else if(data < root->value)  //在左子树继续查找
		return SearchBST(root->lchild,data,root,p);
	else if(data > root->value)  //在右子树继续查找
		return SearchBST(root->rchild,data,root,p);
}

//当二叉排序树root中不存在关键字等于data的数据元素时,插入data
inline void InsertBST(BiTree &root,int data)     //root为传引用指针
{  
	BiTree p,s;
	if(!SearchBST(root,data,NULL,p))    //查找不成功
	{
		s=(struct BiTNode *)malloc(sizeof(BiTNode));
		s->value=data;
		s->lchild=s->rchild=NULL;
		if(p==NULL)    //二叉排序树为空的时候,被插入结点*s为新的根结点
			root=s;
		else if(LT(data,p->value))           //被插结点*s为左孩子
			p->lchild=s;
		else           //被插结点*s为右孩子
			p->rchild=s;
	}
	return ;
}
void PreOrderTraverse(BiTree root)    //先序遍历
{
	if(root)
	{
		printf("%d ",root->value);
		PreOrderTraverse(root->lchild);
		PreOrderTraverse(root->rchild);
	}
}
void InOrderTraverse(BiTree root)    //中序遍历
{
	if(root)
	{
		InOrderTraverse(root->lchild);
		printf("%d ",root->value);
		InOrderTraverse(root->rchild);
	}
}
void PostOrderTraverse(BiTree root)    //后序遍历
{
	if(root)
	{
		PostOrderTraverse(root->lchild);
		PostOrderTraverse(root->rchild);
		printf("%d ",root->value);
	}
}
int Delete(BiTree &p){
	BiTree q,s;
    if(!p->rchild){ //右子树空的话只需重接它的左 
	   q = p; p = p->lchild; free(q);
	}
	else if (!p->lchild){   //左子树为空的话,只需重接它的右子树
	   q = p; p = p->rchild; free(q);
	}
    else{  //左右子树均不为空
	   q = p;  s = p->lchild;
	   while(s->rchild) {   //转左。然后向右走到尽头
	    q = s; s = s->rchild;
	   }
	   p->value = s->value;  //s指向被删除结点的前驱
	   if(q != p) {q->rchild = s->lchild;} //重接*q的右子树
	   else {q->lchild = s->lchild;} //重接*q的左子树
		delete s;
	}
	return true;
}
int DeleteBST(BiTree &T,int key)
{
	 if(!T) return false;
	 else{
	   if(key == T->value) return Delete(T);  //找到关键字为key的数据元素
	   else if(key < T->value) return DeleteBST(T->lchild,key);//关键字小于结点的话,即在左子树
	   else return DeleteBST(T->rchild,key); //关键字大于结点的话,即在右子树
	 }
}

int main(void)
{
	int i,a[101],n,data,findkey,menu,insertkey;
	BiTree root,pp;
	printf("二叉排序树的操作:\n");
    printf("                1:创建二叉排序树!\n");
    printf("                2:查找关键字!\n");
    printf("                3:插入关键字!\n");	
	printf("                4:删除关键字!\n");
	printf("                0:退出!\n");
	//输入结点的个数
	printf("请输入相应操作:");
	scanf("%d",&menu);
	while(!(menu>=0 && menu <= 4)){
	  printf("您的输入有问题,请重新输入:");
	  scanf("%d",&menu);
	}
	while(menu != 0){/////////////////////////////////////
		switch(menu){ ///////////////////////
		case 1:{ ///////////////////
	            printf("输入初始化结点的个数:");
                scanf("%d",&n);
				root=NULL;
				printf("输入各个结点的值:");
				for(i=1;i<=n;i++)
				{
					scanf("%d",&a[i]);
					InsertBST(root,a[i]);
				}
                printf("输出先序遍历结果:");
				PreOrderTraverse(root);
				printf("\n");
				printf("输出中序遍历结果:");
				InOrderTraverse(root);
				printf("\n");
				printf("输出后序遍历结果:");
				PostOrderTraverse(root);
				printf("\n");
				break;
			 }//////////////////////////////case
		case 2:{
			    printf("输入你要查找的关键字:");
				scanf("%d",&findkey);
				if(SearchBST(root,findkey,NULL,pp)){
				printf("查找成功!\n");
				}else{
				printf("查找失败!\n");
				}
				break;
			   }
        case 3:{
			    printf("请输入你插入的关键字:");
				scanf("%d",&insertkey);
				InsertBST(root,insertkey);
              	printf("\n");
				printf("输出中序遍历结果:");
				InOrderTraverse(root);
				printf("\n");
			    break;
			   }
		case 4:{
			    printf("输入你想删除的关键字:");
				scanf("%d",&data);
				DeleteBST(root,data);
				printf("\n");
				printf("输出中序遍历结果:");
				InOrderTraverse(root);
				printf("\n");
				break;
			   }
		   /*
			while(scanf("%d",&n)!=EOF)
			{
				root=NULL;
     			printf("输入各个结点的值:");
				for(i=1;i<=n;i++)
				{
					scanf("%d",&a[i]);
					InsertBST(root,a[i]);
				}
				printf("输出先序遍历结果:");
				PreOrderTraverse(root);
				printf("\n");
				printf("输出中序遍历结果:");
				InOrderTraverse(root);
				printf("\n");
				printf("输出后序遍历结果:");
				PostOrderTraverse(root);
				printf("\n");
				printf("输入你要查找的关键字:");
				scanf("%d",&findkey);
				if(SearchBST(root,findkey,NULL,pp)){
				printf("查找成功!\n");
				}else{
				printf("查找失败!\n");
				}
         
				printf("输入你想删除的关键字:");
				scanf("%d",&data);
				DeleteBST(root,data);
				printf("\n");
				printf("输出中序遍历结果:");
				InOrderTraverse(root);

			}*/
		} //////switch
	 printf("请继续输入相应操作:");
    	scanf("%d",&menu);
	}//while
	return 0;
}

操作结果如下:


版权声明:本文为博主原创文章,未经博主允许不得转载。

查找算法总结之二(动态查找表)

查找树查找算法总结(二),动态查找表
  • JerryBurning
  • JerryBurning
  • 2015年06月25日 14:54
  • 3131

动态查找表

【问题描述】动态查找表的特点是表结构本身在查找过程中动态生成,即对给定的关键字key,若表中存在其关键字等于key的记录,则查找成功返回,否则插入关键字等于key的记录。设计一个有关动态查找表(以二叉...
  • sdp
  • sdp
  • 2006年09月13日 09:26
  • 4265

静态查找表与动态查找表

一、静态查找表 1.顺序表查找 顺序查找(Sequential Search)又称为线性查找,是一种最简单的查找方法。 查找过程如下: 从线性表的一端开始顺序扫描线性表,依次将扫描到的...
  • zhangkongzhongyun
  • zhangkongzhongyun
  • 2014年03月24日 15:06
  • 6648

数据结构 二叉排序树的创建,查找,插入,删除

Description 实现二叉排序树的创建、查找、插入、删除操作。 Input 10 62 88 58 47 35 73 51 99 37 93 59 58 Output 输入二叉树...
  • mazicwong
  • mazicwong
  • 2016年11月24日 15:44
  • 1946

二叉排序树(新建,插入,查找,删除)(C语言编写)

#include #include typedef struct BSTNode{         int data;         struct BSTNode *lchil...
  • qq_33609401
  • qq_33609401
  • 2016年11月23日 19:23
  • 589

二叉排序树(查询、插入、删除)

“二叉排序树,又称为二叉查找树。它或者是一颗空树,或者具有下列性质的二叉树。 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有节点的值均...
  • wangyunyun00
  • wangyunyun00
  • 2014年04月14日 22:00
  • 17030

二叉排序树的创建,查找,插入,删除

二叉排序树或者是空树,或者是具有以下性质的二叉树: (1)若左子树非空,则左子树上所有结点的关键字的值均小于它的根结点的关键字的值 (2)若右子树非空,则右子树上所有结点的关键字的值均大于等于它的...
  • yxmmao
  • yxmmao
  • 2016年06月06日 22:41
  • 743

二叉排序树的基本操作(建立,中序遍历,查找,删除,插入)

分析: 二叉排序树的操作的难点在于删除操作,删除操作时,只需要满足二叉排序树的性质即可,即需要找到要删除结点p的左孩子的最右下方的数替代该结点的数据,然后删除p->lchild的最右下方的结点即可。...
  • llwwlql
  • llwwlql
  • 2015年11月28日 20:50
  • 1272

二叉排序树的建立、插入、删除、查找、4种遍历 C++完整实现

#include #include #include using namespace std; typedef int KeyType; #define NUM 13 class BinSTree;...
  • u010367506
  • u010367506
  • 2014年04月01日 15:25
  • 2773

动态查找—二叉排序树

动态查找的大多借助于树类型的结构,这里只介绍最简单的一种——二叉排序树。 二叉排序树是这样一种树:它的要么是空的;如果它的左子树不为空,那么左子树上所有节点的值均小于根节点的值;如果右子树不为空,那...
  • thefutureisour
  • thefutureisour
  • 2012年08月30日 16:38
  • 2337
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态查找表之二叉排序树(BST)的 创建、查找、插入与删除
举报原因:
原因补充:

(最多只允许输入30个字)