二叉排序树BST

二叉排序树BST 原则就是小的话接左边,大的话接右边,必须说的是效率太低主要是刚开始理解错了不需要再写什么Creat函数的,直接搜着插着就能进行可怜可怜

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

#define    OK      1
#define    ERROR   0
#define    TRUE    1
#define    FALSE   0
#define    NULL    0

typedef    int     ElemType;
typedef    int     Status;
typedef    int     KepType;

typedef struct BiTNode{
	ElemType        data;
	struct BiTNode * lchild, * rchild;
}BiTNode, * BiTree;

Status SearchBST(BiTree T, int key, BiTree f, BiTree &p){ 
	//此次查找是为Insert做准备
	//在根指针T所指的二叉树中递归地查找其关键字等于key的数据元素,若成功,
   // 则指针p指向该数据元素结点,并返回TRUE,否则指针p指向查找路径上访问的
   //最后一个结点并返回FALSE,指针f指向T的双亲,其初始调用值为NULL

	if(!T)
	{
		p=f;
		return FALSE;
	}                          //查找不成功
	else if (key==T->data)
	{
		p=T;
		return TRUE;
	}                            //查找成功
	else if(key < T->data) return SearchBST(T->lchild, key, T, p);    //在左子树中继续查找
	else if(key > T->data) return SearchBST(T->rchild, key, T, p);    //在右子树中继续查找
}

Status InsertBST(BiTree &T, ElemType e){
	//当二叉排序树T中不存在关键字等于e的数据元素时,插入e并返回TRUE,否则返回FALSE

	BiTree p=NULL;
	if(!SearchBST(T, e, NULL, p))
	{
		BiTree s;
		s=(BiTree)malloc(sizeof(BiTNode));
		s->data = e;
		s->lchild = s->rchild = NULL;
		if(!p) T = s;                 //被插结点*s为新的根结点
		else if(e < p->data) p->lchild = s;
		else if(e > p->data) p->rchild = s;
		return TRUE;
	}
	else return FALSE;
}

Status DeleteBST(BiTree &p){
	//从二叉排序树中删除结点p,并重接它的左或右子树

	BiTree q;
	if(!p->rchild)           //右子树空则只用接左子树
	{
		q=p;
		p=p->lchild;
		free(q);
	}
	else if(!p->lchild)   //左子树空则只用接右子树
	{
		q=p;
		p=p->rchild;
		free(q);
	}
	else     //左右均不空
	{
		BiTree s;
		q=p;
		s=p->lchild;
		while(s->rchild)
		{
			q=s;
			s=s->rchild;
		}
		p->data=s->data;
		if(q != p)
			q->rchild = s->lchild;
		else 
			q->lchild = s->lchild;
	}
	return OK;
}

Status InOrderTraverse(BiTree T)  //中序递归遍历
 {  

    if(T)  
    {  
        InOrderTraverse(T->lchild);  
        printf("%d ",T->data);   
        InOrderTraverse(T->rchild);  
     }  
     return OK;  
} 


int main()
{
	BiTree T=NULL;
	int e;
	int num;
	printf("输入初始的结点数:\n");
	scanf("%d", &num);
	while(num--)
	{
	    scanf("%d",&e);
	    InsertBST(T,e);
	}
	InOrderTraverse(T);
	printf("\n");
	printf("输入要插入的数据个数:\n");
	scanf("%d", &num);
	while(num--)
	{
		scanf("%d", &e);
		InsertBST(T,e);
	}
	InOrderTraverse(T);
	printf("\n");
	DeleteBST(T);
	InOrderTraverse(T);
	printf("\n");
    return 0;
}


 

posted on 2011-12-01 23:33  java课程设计例子  阅读(427)  评论(0编辑  收藏  举报