二叉查找树的各种操作

作    者:王鹏   
* 完成日期:2016年 3 月 13 日    
* 问题描述:二叉查找树的各种操作    
* 输入描述:以0代替树的儿子为空
* 程序输出:如代码所示  
#include<stdio.h>
#include<stdlib.h>

typedef struct TreeNode *SearchTree;
typedef struct TreeNode *Position;
typedef int ElementType; 

typedef struct TreeNode{
	ElementType Element;
	SearchTree Left;
	SearchTree Right;
	
}BiTNode;

//二叉查找树的函数声明 

SearchTree CreateTree();                                      //创建二叉树 
Position Find(ElementType X, SearchTree T);                   //查找 
Position FindMax(SearchTree T);
Position FindMin(SearchTree T);
SearchTree Insert(ElementType X, SearchTree T);               //插入 
SearchTree Delete(ElementType X, SearchTree T);               //删除 
void PreOrder_1(SearchTree T);                                //先序遍历(递归) 
int main()
{
	SearchTree T;
	ElementType Element;

	int flag = 1, i;
	
	    printf("                   本程序实现二叉查找树的基本操作。                     \n");
	   
	while(flag){
		
		printf("|                                                                      |\n"); 
		printf("|**********************************************************************|\n");
		printf("|                        二叉查找树的基本操作如下:                    |\n");
		printf("|                           0.创建二叉树                               |\n");
		printf("|                           1.查找                                     |\n");
		printf("|                           2.插入                                     |\n");
		printf("|                           3.删除                                     |\n");
		printf("|                           4.将二叉查找树遍历                         |\n");
		printf("|**********************************************************************|\n"); 
		printf("|                           请选择功能:                               |\n"); 
		
		scanf("%d", &i);   
		                      //输入需要选择的功能 
		switch(i){
			case 0:
				printf("请输入二叉树的根结点(0代表NULL):");
				T = CreateTree();
				break; 
				
			case 1:
				if(T){
					printf("请输入要查找的元素:");
					scanf("%d", &Element); 
				    if( Find(Element, T))
				        printf("该元素存在!\n");
					else
					 	printf("该元素不存在!\n");
				}else
				    printf("       二叉查找树为空!\n");
				break;	 
				
			case 2:
				if(T){
					printf("请输入要插入的元素:");
					scanf("%d", &Element); 
					T = Insert(Element, T); 
				}else
				    printf("       二叉查找树为空!\n");
				break;	
				   
			case 3:
				if(T){
					printf("请输入要删除的元素:");
				    scanf("%d", &Element); 
					T = Delete(Element, T); 
				}else
				    printf("       二叉查找树为空!\n");
				break;	
			case 4:
				if(T){
					printf("(先序)遍历的结果为:");
					PreOrder_1(T);
					printf("\n"); 
				}else
				    printf("       二叉树为空!\n");
				break;	
					
			default:
			    flag = 0;
				printf("程序运行结束,按任意键退出!\n");	
		}  
		
	}
	return 0;
} 







//二叉查找树的函数 
SearchTree CreateTree()                            //创建二叉树 
{
	ElementType ch;
	SearchTree T; 
	
	scanf("\n%d", &ch);
	if(ch == 0)
	   T = NULL;
	else{
		if(!(T = (SearchTree)malloc(sizeof(BiTNode))))
		   exit(-1);
		T->Element  = ch;
		printf("%d的左儿子为:", T->Element ); 
		T->Left = CreateTree(); 
		printf("%d的右儿子为:", T->Element ); 
		T->Right = CreateTree();
	}   
	return T; 
}

Position Find(ElementType X, SearchTree T)     //二叉树的查找 
{
	if(T == NULL)
	    return NULL;
	if(X < T->Element)
	    return Find(X, T->Left);
	else if(X > T->Element)
	    return Find(X, T->Right);
	else
	    return T;		    
}
 
Position FindMax(SearchTree T)                 //找最大值(非递归) 
{
	if(T != NULL){
		while(T->Right != NULL )
		    T = T->Right;	    
	}
	 
	 return T;    
}
// Position FindMax(SearchTree T)              //找最大值(递归) 
//{
//	if(T == NULL)
//      return NULL;
//  else if(T->Right == NULL)
//	    return T;
//	else
//	    return FindMax(T->Right);	    
//	}

Position FindMin(SearchTree T)                 //找最小值(非递归) 
{
	if(T != NULL){
		while(T->Left != NULL )
		    T = T->Left;	    
	}
	 
	 return T;    
}
// Position FindMin(SearchTree T)              //找最小值(递归) 
//{
//	if(T == NULL)
//      return NULL;
//  else if(T->Left == NULL)
//	    return T;
//	else
//	    return FindMax(T->Left);	    
//	}

SearchTree Insert(ElementType X, SearchTree T)  //插入元素到二叉树 
{
	if(T == NULL){
		if(!(T = malloc(sizeof(struct TreeNode))))
		    exit(-1);
		else{
			T->Element = X;
			T->Left = T->Right = NULL;
		}    
		
	}else if(X < T->Element)
	    T->Left = Insert(X, T->Left);
	 else if(X > T->Element)
	    T->Right = Insert(X, T->Right);
		
	return T;	  
}
SearchTree Delete(ElementType X, SearchTree T)  //删除元素 
{
	Position TmpCell;
	if(T == NULL)
	    printf("没找到\n"); 
	else if(X < T->Element)
	    T->Left = Delete(X, T->Left);
	else if(X > T->Element)
	    T->Right = Delete(X, T->Right);
	else if(T->Left && T->Right){
		TmpCell = FindMin(T->Right);
		T->Element = TmpCell->Element;
		T->Right = Delete(T->Element, T->Right);
	}else{
		TmpCell = T;
		if(T->Left == NULL)
		    T = T->Right;
		else if(T->Right == NULL)
		    T = T->Left;
		free(TmpCell);	 	    
	}
	return T;
}   

void PreOrder_1(SearchTree T)                      //先序遍历(递归) 
{
	if(T){
	
		printf("%d  ", T->Element);
		PreOrder_1(T->Left);
		PreOrder_1(T->Right);
	}
 }  


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值