1、二叉搜索数的概念
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:
- 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
- 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
- 它的左右子树也分别为二叉搜索树
2、二叉搜索树操作
2.1、二叉搜索树的查找
2.2、二叉搜索树的插入
a、树为空,则直接插入
如果是空树,直接插入,然后返回true
b、树不空,按二叉搜索树性质查找插入位置,插入新节点
①、按照二叉搜索树的性质,查找到插入节点的位置;
②、插入新节点。
二叉搜索树的插入都是插入到叶子节点上
2.3、二叉搜索树的删除
首先查找元素是否在二叉搜索树中,如果不存在,则返回,否则要删除的节点可能分下面四种情况:
- a、要删除的节点无孩子节点
- b、要删除的节点只有左孩子节点
- c、要删除的节点只有右孩子节点
- d、要删除的节点有左、右孩子节点
看起来有待删除节点有4种情况,实际情况a可以与情况b或者c合并起来,因此真正的删除过程如下:
- 情况b:删除该节点且使被删除节点的双亲结点指向被删除结点的左孩子结点
- 情况c:删除该节点且使被删除结点的双亲结点指向被删除结点的右孩子结点
- 情况d:在它的右子树中寻找中序下的第一个结点(关键码最小),用它的值填补到被删除结点中,再来处理该结点的删除问题 / 右子树中找最小值,左子树中找最大值
3、二叉搜索树的实现
二叉搜索树的插入函数
BinTree Insert(ElementType x, BinTree BT) {
if (!BT) {
BT = (BinTree)malloc(sizeof(struct TreeNode));
BT->data = x;
BT->left = BT->right = NULL;
}
else if (x > BT->data) {
BT->right = Insert(x, BT->right);
}
else if (x < BT->data) {
BT->left = Inert(x, BT->left);
}
return BT;
}
二叉搜索树的删除函数
右子树中找最小值
BinTree Delete(ElementType x, BinTree BT) {
BinTree TP;
if (!BT) {
cout << "找不到要删除的元素" << endl;
}
else if (x < BT->data) {
BT->left = Delete(x, BT->left);
}
else if (x > BT->data) {
BT->right = Delete(x, BT->right);
}
else {
if (BT->left&&BT->right) {
TP = FindMin(BT->right);
BT->data = TP->data;
BT->right = Delete(BT->data, BT->right);
}
else {
TP = BT;
if (!BT->left) {
BT = BT->right;
}
else if (!BT->right) {
BT = BT->left;
}
free(TP);
}
}
}
4、二叉搜索树的性能
二叉搜索树的插入、删除、查找的时间复杂度都是O(N),二叉搜索树的高度一定不是longN,因为logN针对的是平衡二叉树。