# 二叉查找树的部分例程

searchtree.h

#ifndef SEARCHTREE_H_INCLUDED
#define SEARCHTREE_H_INCLUDED

typedef  int ElementType;
struct treenode;
typedef  struct treenode *Position;
typedef  Position  SearchTree;
struct  treenode
{
ElementType  data;
SearchTree  left;
SearchTree  right;
};

SearchTree  MakeEmpty(SearchTree  T);
Position  Find(ElementType  X,SearchTree  T);
Position  FindMin(SearchTree  T);
Position  FindMax(SearchTree  T);
SearchTree  Insert(ElementType  X,SearchTree  T);
SearchTree  Delete(ElementType  X,SearchTree  T);

#endif // SEARCHTREE_H_INCLUDED


searchtree.c

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

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->data)
return  Find(X, T->left);
else if(X >T->data)
return  Find(X,T->right);
else
return  T;
}

Position  FindMin(SearchTree  T)
{
if(T==NULL)
return  NULL;
else  if(T->left ==NULL)
return T;
else
return FindMin(T->left);
}

Position  FindMax(SearchTree  T)
{
if(T!=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("Error: out of space!!!");
else
{
T->data=X;
T->left =T->right =NULL;
}
}
else  if(X <T->data)
{
T->left =Insert(X, T->left);
}
else  if(X >T->data)
{
T->right  =Insert(X , T->right);
}

return T;   /**< don't forget  this line!!!! */
}

SearchTree  Delete(ElementType  X,SearchTree  T)
{
Position  temp;

if(T==NULL)
printf("Error: not this element!!!");
else if(X <T->data)
T->left =Delete(X, T->left);   /**<  Go left */
else if(X >T->data)
T->right =Delete(X, T->right);  /**< go  right */
else     /**< find  element,delete it */
{
if(T->left && T->right)
{
temp =FindMin(T->right) ;  /**< the minest value  in right subtree */
T->data =temp->data;
T->right =Delete(T->data, T->right);   /**< 删去右子树中的最小节点，可以编写deletemin函数以提高效率 */
}
else
{
temp =T;
if(T->left ==NULL)
T=T->right;
else
T=T->left;
free(temp);
}
}

return  T;
}

• 本文已收录于以下专栏：

## 二叉查找树的基本例程

• xiahouzuoxin
• 2012年11月07日 20:13
• 1872

## 数据结构：线索树之基本例程（1）

• pp634077956
• 2015年09月01日 18:12
• 241

## 数据结构-二叉树和二叉查找树

• tuke_tuke
• 2015年12月20日 17:44
• 2172

## 二叉查找树的应用

• liuhuiyi
• 2012年07月17日 14:34
• 1066

## 从二叉查找树到平衡二叉树再到红黑树

• guimingyue
• 2014年04月12日 11:10
• 1677

## LintCode 不同的二叉查找树

• shinanhualiu
• 2015年12月08日 22:03
• 1113

## #sicily#1003.计算二叉查找树的高度

• LoHiauFung
• 2016年12月30日 11:31
• 937

## 堆和二叉查找树的建立的时间复杂度

• vainlyhopelim
• 2015年08月09日 18:31
• 674

## 算法导论第十二章：二叉查找树

• longhuihu
• 2011年02月26日 10:04
• 3117

## lintcode validate-binary-search-tree 验证二叉查找树

• waltonhuang
• 2016年07月22日 17:03
• 385

举报原因： 您举报文章：二叉查找树的部分例程 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)