二叉查找树常常会考到和使用到,本文练习下它的几个基本操作,即节点的查找、插入和删除及找最大值、最小值等。
1,二叉查找树的查找
由于二叉查找树的性质是,每个节点的关键字值大于其左子树的所有节点,同时小于右子树的所有节点。因此查找就可以利用其性质来进行。
实现代码如下:
/* node struct */
class node
{
public:
int value;
node* left;
node* right;
};
node* find(node* root, const int key)
{
if (NULL == root)
{
return NULL;
}
node* pos = root;
while(NULL != pos)
{
if (key == pos -> value)
{
break;
}
else if (key < pos -> value)
{
pos = pos -> left;
}
else
{
pos = pos -> right;
}
}
return pos;
}
2,二叉查找树找最大节点和最小节点
同样,利用二叉查找树的性质,有以下实现代码:
node* find_max(node* root)
{
if (NULL == node)
{
return NULL;
}
node* pos = root;
while (NULL != pos -> right)
{
pos = pos -> right;
}
return pos;
}
node* find_min(node* root)
{
if (NULL == root)
{
return NULL;
}
node* pos = root;
if (NULL != root -> left)
{
pos = pos -> left;
}
return pos;
}
3,二叉查找树的插入
往二叉查找树插入一个节点,需要保持二叉查找树的性质,因此一种插入的思想是运用二叉查找树的查找思想,查找新关键字应该放在树中的哪个位置,具体的实现代码如下(通过下面代码,可以知道在树中可以很方便的通过递归来实现相关操作):
node* insert(node* root, const int key)
{
if (NULL == root)
{
root = new node;
if (NULL == root)
{
return NULL;
}
root -> value = key;
root -> left = NULL;
root -> right = NULL;
return root;
}
if (key < pos -> value)
{
root -> left = insert(root -> left, key);
}
else
{
root -> right = insert(root -> right, key);
}
return root;
}
4,最后看下二叉查找树的删除
删除分两种情况,一种是被删节点有一个子节点或0个子节点,另一种是被删子节点有两个子节点。对于前一种情况,处理较为简单,直接删除相应节点,若其有一个子节点,则将该子节点挂载到相应节点的父节点上;对于第二种情况,处理更复杂一些,一种处理方式是,将该节点的右子树的最小节点的关键字赋给当前节点,随后递归的在右子树中删除该最小节点,这样会一直递归到被删除的节点只有一个子节点或没有子节点。
在《数据结构与算法分析》上截两个删除示意图如下:
具体实现代码如下:
node* delete(node* root, const int key)
{
if (NULL == root)
{
return NULL;
}
node* pos = NULL;
if (key < root -> value)
{
root -> left = delete(root -> left, key);
}
else if (key > root -> value)
{
root -> right = delete(root -> right, key);
}
else // find the node
{
if (NULL != root -> left && NULL != root -> right)
{
pos = find_min(root -> right);
root -> value = pos -> value;
root -> right = delete(root -> right, root -> value);
}
else
{
pos = root;
if (NULL != root -> left)
{
root = root -> left;
}
else if (NULL != root -> right)
{
root = root -> right;
}
delete pos;
pos = NULL;
}
}
return root;
}