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;
}