二叉查找树简要实现

/*查找二叉树简要实现
 *
 *
 */
#include <stdio.h>      
#include <stdlib.h>      

struct TreeNode;
typedef int ElementType;
typedef struct TreeNode* PtrToNode;
typedef PtrToNode Tree;
typedef PtrToNode Position;

struct TreeNode{
	ElementType data;
	Tree LChild;
	Tree RChild;
};

Tree CreateBiTree();/*创建一颗树*/
Tree Insert(ElementType X, Tree T);/*插入二叉树*/
Tree Delete(ElementType X, Tree T);/*删除某结点*/
Position FindElement(ElementType X, Tree T);/*查找某元素*/
Position FindMin(Tree T);/*查找最小元素*/
Position FindMax(Tree T);/*查找最大元素*/
void Disptree(Tree T);/*凹入表示法输出二叉树* /
void PreOrderTraverse(Tree T);/*前序遍历二叉树*/
void InOrderTraverse(Tree T);/*中序遍历二叉树*/
void PostOrderTraverse(Tree T);/*后序遍历二叉树*/

/*创建一颗空树*/
Tree CreateBiTree(){
	int array[10] = { 62, 88, 58, 47, 35, 73, 51, 99, 37, 93 };
	Tree T = NULL;
	for (int i = 0; i < 10; i++){
		T = Insert(array[i], T);
	}
	return T;
}

/*插入二叉树*/
Tree Insert(ElementType X, Tree T){
	if (T == NULL){
		T = malloc(sizeof(struct TreeNode));
		if (T == NULL)
			return NULL;
		else{
			T->data = X;
			T->LChild = T->RChild = NULL;
		}
	}
	else
	if(X < T->data){
		T->LChild = Insert(X, T->LChild);
	}
	else
	if (X > T->data){
		T->RChild = Insert(X, T->RChild);
	}
	return T;
}

/*前序遍历二叉树*/
void PreOrderTraverse(Tree T){
	if (T != NULL){
		printf("%d ", T->data);
		PreOrderTraverse(T->LChild);
		PreOrderTraverse(T->RChild);
	}
}

/*中序遍历二叉树*/
void InOrderTraverse(Tree T){
	if (T != NULL){
		InOrderTraverse(T->LChild);
		printf("%d ", T->data);
		InOrderTraverse(T->RChild);
	}
}

/*后序遍历二叉树*/
void PostOrderTraverse(Tree T){
	if (T != NULL){
		PostOrderTraverse(T->LChild);
		PostOrderTraverse(T->RChild);
		printf("%d ", T->data);
	}
}

//凹入表示法输出二叉树
void Disptree(Tree T)
{
	if (T)
	{
		printf("%d", T->data);
		if (T->LChild || T->RChild)
		{
			printf("(");
			Disptree(T->LChild);
			if (T->RChild)
				printf(",");
			Disptree(T->RChild);
			printf(")");
		}
	}
}

/*查找某元素*/
Position FindElement(ElementType X, Tree T){
	if (T == NULL)
		return NULL;
	if (X < T->data)
		return FindElement(X, T->LChild);
	else 
	if (X > T->data)
		return FindElement(X, T->RChild);
	else
		return T;
}

/*查找最小元素*/
Position FindMin(Tree T){
	if (T == NULL)
		return NULL;
	else
	if (T->LChild == NULL)
		return T;
	else
		return FindMin(T->LChild);
}

/*查找最大元素*/
Position FindMax(Tree T){
	if (T == NULL)
		return NULL;
	else
	if (T->RChild == NULL)
		return T;
	else
		return FindMax(T->RChild);
}

/*删除某结点*/
Tree Delete(ElementType X, Tree T){
	Position TmpCell;

	if (T == NULL)
		return NULL;
	else
	if (X < T->data)
		T->LChild = Delete(X, T->LChild);
	else
	if (X > T->data)
		T->RChild = Delete(X, T->RChild);
	else
	if (T->LChild && T->RChild){/*结点有两个孩子*/
		TmpCell = FindMin(T->RChild);
		T->data = TmpCell->data;
		T->RChild = Delete(T->data, T->RChild);
	}
	else{/*结点有一个孩子或没有孩子*/
		TmpCell = T;
		if (T->LChild == NULL)
			T = T->RChild;
		else if (T->RChild == NULL)
			T = T->LChild;
		free(TmpCell);
	}
	return T;
}

void main(){
	Tree T;
	Position P;

	T = CreateBiTree();
	printf("生成一颗二叉树(凹入表示法表示):\n");
	Disptree(T);

	printf("\n\n前序遍历:\n");
	PreOrderTraverse(T);
	printf("\n中序遍历:\n");
	InOrderTraverse(T);
	printf("\n后序遍历:\n");
	PostOrderTraverse(T);

	printf("\n\n插入100后:\n");
	T = Insert(100, T);
	Disptree(T);

	printf("\n插入40后:\n");
	T = Insert(40, T);
	Disptree(T);

	printf("\n删除47后:\n");
	T = Delete(47, T);
	Disptree(T);

	printf("\n删除88后:\n");
	T = Delete(88, T);
	Disptree(T);

	P = FindElement(99, T);
	if (P)
		printf("\n\n查找元素99(有则返回元素):%d", P->data);
	P = FindMin(T);
	if (P)
		printf("\n最小元素为:%d", P->data);
	P = FindMax(T);
	if (P)
		printf("\n最大元素为:%d", P->data);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值