一、二叉查找树
二叉查找树的特点是每个节点最多只能有两个儿子节点,并且父节点大于左子节点,小于右子节点。
#include <iostream>
#include <algorithm>
using namespace std;
typedef int ElementType;//数据类型
//二叉树的每个节点不能有多于两个的儿子
struct TreeNode;
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree;
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);
ElementType Retrieve(Position P);
void PrintTree(SearchTree T);
int Height(Position P);
struct TreeNode
{
ElementType Element;
SearchTree Left;
SearchTree Right;
};
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;
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;
else if (T->Left == NULL)//已经找不到最小值了
return T;
else
return FindMin(T->Left);
}
Position FindMax(SearchTree T)
{
//递归方式
if (T == NULL)
return NULL;
else if (T->Right == NULL)//已经找不到最大值了
return T;
else
return FindMax(T->Right);
/*
//非递归方式
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)
{
cerr << "Out of space" << endl;
}
else
{
T->Element = X;
T->Left = T->Right = NULL;
}
}
else
{
if (X < T-