0、准备工作
#include <stdlib.h>
typedef int Item;
int Less(Item left, Item right)
{
return (left < right);
}
int Greater(Item left, Item right)
{
return Less(right, left);
}
int Equal(Item left, Item right)
{
return !(Less(left, right)) && !Less(right, left);
}
typedef struct Node Node;
typedef struct Node *Tree;
struct Node
{
Item data;
Tree left;
Tree right;
};
typedef void(*Visit)(Node*);
void PrintNode(Node *node)
{
printf("%d\n", node->data);
}
1、构建二叉搜索树
/* 新建一个节点 */
Node* NewNode(Item data)
{
Node *pNode = (Node*)malloc(sizeof(Node));
if(NULL == pNode)
{
return NULL;
}
pNode->data = data;
pNode->left = NULL;
pNode->right = NULL;
return pNode;
}
/* 构造二叉搜索树 */
Tree InsertBSTree(Tree tree, Node *pNode)
{
if(NULL == tree)
{
return pNode;
}
if(Less(pNode->data, tree->data))
{
tree->left = InsertBSTree(tree->left, pNode);
}
else if(Greater(pNode->data, tree->data))
{
tree->right = InsertBSTree(tree->right, pNode);
}
else
{
/* do nothing */
}
return tree;
}
2、遍历二叉树
/* 中序遍历二叉树 */
void TraverseInOrder(Tree tree, Visit visit)
{
if(NULL == tree)
{
return;
}
TraverseInOrder(tree->left, visit);
visit(tree);
TraverseInOrder(tree->right, visit);
}
3、二分查找算法
// 二叉搜索树上执行二分查找算法
Node* FindBSTree(Tree tree, Item data)
{
if(NULL == tree)
{
return NULL;
}
if(Less(data, tree->data))
{
return FindBSTree(tree->left, data);
}
else if(Greater(data, tree->data))
{
return FindBSTree(tree->right, data);
}
else
{
return tree;
}
}