二叉查找树实现

frome 《数据结构与算法分析》

使二叉树称为二叉查找树的性质是,对于书中的每个节点X,它的左子树中所有关键字小于X 的关键字值,

而它的右子树中所有关键字值大于X的关键字值。

 中序遍历可以让结点有序。

// SearchTree.cpp : 定义控制台应用程序的入口点。
//查询二叉树 

#include "stdafx.h"
#include "stdlib.h"

typedef int ElementType;
typedef struct TreeNode* SearchTree;
typedef struct TreeNode* Position;
struct  TreeNode
{
	ElementType Element;
	SearchTree Left;
	SearchTree Right;
};
SearchTree Init(ElementType X);
SearchTree MakeEmpty(SearchTree);
SearchTree Insert(ElementType X, SearchTree T);
SearchTree Delete(ElementType X, SearchTree T);
Position FindMin(SearchTree T);
Position FindMax(SearchTree T);
Position Find(ElementType x, SearchTree T);

SearchTree Init(ElementType X)
{
	SearchTree T = (SearchTree)malloc(sizeof(struct  TreeNode));
	T->Element = X;
    T->Left = T->Right = NULL;
	return T;
}
SearchTree MakeEmpty(SearchTree T)
{
	if (T != NULL)
	{ 
		MakeEmpty(T->Left);
		MakeEmpty(T->Right);
		free(T);
	}
	return NULL;
}
Position Find(ElementType X, SearchTree T)
{
	//可能性最小的情况放在最后
	if (T == NULL)
		return NULL;
	else if (X<T->Element)
  	{
	    return Find(X, T->Left);
	}
	else if (X>T->Element)
	{
		return Find(X, T->Right);
	}
	else
	{
		return T;
	}
}
//求最小值递归形式
Position FindMin(SearchTree T)
{
	if (T == NULL)
		return NULL;
	if (T->Left != NULL)
		return FindMin(T);
	else
		return T;

}
 //求最大值非递归形式
Position FindMax(SearchTree T)
{
	if (T == NULL)
		return NULL;
	while (T->Right!=NULL)
	{
		T = T->Right;
	}
	return T;
}
SearchTree Insert(ElementType X, SearchTree T)
{
	if (T == NULL)
	{
		T = (SearchTree)malloc(sizeof(struct  TreeNode));
		if (T == NULL)
			printf("out of memory");
		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);
	}
	//else X已经在树中  啥也不做
	 
	//这时T是指向新树根的指针
	return T;
}
SearchTree Delete(ElementType X, SearchTree T)
{
	SearchTree TmpCell;
	if (T == NULL)
		printf("no this element");
	else if (X < T->Element)
		T->Left = Delete(X, T->Left);
	else if (X >T->Element)
		T->Right= Delete(X, T->Right);
	//else 找到Element X
	//有两个孩子
	else if (T->Left&&T->Right)
	{
		TmpCell = FindMin(T->Right);
		T->Element = TmpCell->Element;
	    //总会递归到0或1孩子的情况
		T->Right = Delete(TmpCell->Element, T->Right);
	}
	else
	{
		TmpCell = T;
		//T的父亲保存了T的地址  T = T->Right绕过了T
		if (T->Left = NULL)
			T = T->Right;
		if (T->Right= NULL)
			T = T->Left;
		free(TmpCell);
	}
	return T;
}



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值