二叉树的一个重要应用是它们在查找中的应用。为了更方便的阐述二叉查找树的概念,我们这里考虑关键字为互异整数的情形。
使二叉树成为二叉查找树的性质是,对树中的每个节点N,它的左子树的所有关键字小于N的关键字值,而又子树的所有关键字大于N的关键字值。后面我们可以看到,这种方式可以保证元素用统一的方式排序。
1. 二叉树节点声明
struct TreeNode
{
int element;
TreeNode* left;
TreeNode* right;
};
typedef struct TreeNode *PtrNode;
2. 树的初始化
PtrNode MakeEmpty(PtrNode node)
{
if (node != nullptr) {
MakeEmpty(node);
MakeEmpty(node);
delete node;
}
return nullptr;
}
3. 插入操作
PtrNode Insert(int x, PtrNode& node)
{
if (node == nullptr) {
node = new TreeNode;
node->element = x;
node->left = node->right = nullptr;
}
else if (x < node->element) {
node->left = Insert(x, node->left);
}
else if (x > node->element) {
node->right = Insert(x, node->right);
}
return node;
}
4. 查找操作
PtrNode Find(int x, PtrNode node)
{
if (node == nullptr) {
return nullptr;
}
else if (x < node->element) {
return Find(x, node->left);
}
else if (x > node->element) {
return Find(x, node->right);
}
// find element
else {
return node;
}
}
5. 查找最小值
PtrNode FindMin(PtrNode node)
{
if (node == nullptr)
return nullptr;
else if (node->left == nullptr)
return node;
else
return FindMin(node->left);
}
6. 删除操作
PtrNode Delete(int x, PtrNode node)
{
if (x < node->element) {
node->left = Delete(x, node->left);
}
else if (x > node->element) {
node->right = Delete(x, node->right);
}
// two or more node
else if (node->left && node->right) {
PtrNode temp = FindMin(node->right);
node->element = temp->element;
node->right = Delete(temp->element, node->right);
}
else {
PtrNode temp = node;
if (node->left == nullptr) {
node = node->right;
}
else if (node->right == nullptr) {
node = node->left;
}
delete temp;
}
return node;
}