特点
- 节点的左子树仅包含键小于节点键的节点。
- 节点的右子树仅包含键大于节点键的节点。
- 左右子树也必须是二叉搜索树。
事实
- BST 的中序遍历总是产生排序的输出。
- 通过对唯一给定的遍历进行排序来获得中序遍历。
查找
public Node search(Node root,
int key)
{
if (root == null ||
root.key == key)
return root;
if (root.key < key)
return search(root.right, key);
return search(root.left, key);
}
插入
Node insertRec(Node root, int key)
{
if (root == null) {
root = new Node(key);
return root;
}
if (key < root.key)
root.left = insertRec(root.left, key);
else if (key > root.key)
root.right = insertRec(root.right, key);
return root;
}
删除
Node deleteRec(Node root, int key)
{
if (root == null)
return root;
if (key < root.key)
root.left = deleteRec(root.left, key);
else if (key > root.key)
root.right = deleteRec(root.right, key);
else {
if (root.left == null)
return root.right;
else if (root.right == null)
return root.left;
root.key = minValue(root.right);
root.right = deleteRec(root.right, root.key);
}
return root;
}
int minValue(Node root)
{
int minv = root.key;
while (root.left != null) {
minv = root.left.key;
root = root.left;
}
return minv;
}