码迷,mamicode.com
首页 > 编程语言 > 详细

基于二叉搜索树的符号表和BST排序

时间:2015-08-19 16:58:28      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:二叉搜索树   bst   bst排序   二叉查找树   二叉查找树排序   

原代码如下:


#include <stdlib.h>
#include <stdio.h>
//#define Key int
typedef int Key;
struct Item{
	Key key;
	char c;
};
typedef struct STnode* link;
struct STnode{
	Item item ; link l,r; int N;
};

static link head , z ;
static struct Item NULLitem ;

Key key(Item item){
	return item.key;
}
//创建一个节点 
link NEW(Item item, link l,link r, int N){
	link x = (link)malloc(sizeof *x);
	x->item = item;x->l = l;x->r = r;x->N = N;
	if(head==z)head=x; //这句话不能少!!! 
	return x;
}
//初始化 
void STinit(){
	head = ( z = NEW(NULLitem,0,0,0));
}
//节点个数 
int STcount(){
	return head->N; 
} 
//搜索子程序 
Item searchR(link h, Key v){
	Key t = key(h->item);
	if(h==z)return NULLitem;
	if(v==t) return h->item;
	if(v<t) return searchR(h->l,v);
	else return searchR(h->r,v);
}
//搜索主程序 
Item STsearch(Key v){
	return searchR(head,v);
}
//插入子程序 
link insertR(link h, Item item){
	Key v = key(item), t = key(h->item);
	if(h==z)return NEW(item,z,z,1);
	if(v<t) h->l = insertR(h->l,item);
	else h->r = insertR(h->r,item);
	(h->N)++;return h;
}
//插入主程序 
link STinsert(Item item){
	return insertR(head,item);
}
//删除子程序 
Item deleteR(link F){
	Item tmp; link p;
	if(F->l==NULL){
		p = F;
		tmp = F->item;
		F = F->r;
		free(p);
		return tmp;
	}else return deleteR(F->l);
}
//删除子程序 
void deleteRR(link h , Key v){
	
	if(h!=NULL){
		Key t = key(h->item);
		if(v<t) deleteRR(h->l,v);
		else if(v>t) deleteRR(h->r,v);
		else
			if(h->l==NULL) { //处理只有一颗子树或没有子树的情况  1 
				link p = h->r; h=p; free(p);
			}
			else if(h->r==NULL){ //处理只有一颗子树或没有子树的情况  2 
				link p = h->l; h=p; free(p);
			} 
			else h->item= deleteR(h->r); //如果待删除的节点既有左子树又有右子树
							//则用该节点右子树的最左下节点替换之,维持二叉搜索树 
	}
} 
//删除主程序 
void STdelete(Key v){
	 deleteRR(head,v);
}

void sortR(link h){
	if(h==z)return;
	sortR(h->l);
	if(h->item.key!=0)
		printf("%d ",h->item.key);
	sortR(h->r);
}

void STsort(){
	sortR(head);
}

void test(){
	struct Item item1 = {322,'a'};
	struct Item item2 = {23,'a'};
	struct Item item3 = {2,'a'};
	struct Item item4 = {332,'a'};
	STinit();
	STinsert(item1);STinsert(item2);
	STinsert(item4);STinsert(item3);
	STsort();
	printf("\n");
	struct Item item11 = STsearch(23); 
	printf("%d\n",item11.key);
//	STdelete(23);
	STdelete(322);
	STsort();
}


main(){
	test();
} 



运行结果

技术分享

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

基于二叉搜索树的符号表和BST排序

标签:二叉搜索树   bst   bst排序   二叉查找树   二叉查找树排序   

原文地址:http://blog.csdn.net/wen942467928/article/details/47781201

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!