本文已参与「新人创作礼」活动,一起开启掘金创作之路。
二叉排序树(BST)
-
二叉排序树(Binary Search Tree)是一种动态树表。 二叉排序树的定义:二叉排序树或者是一棵空树, 或者是一棵具有如下性质的二叉树: ⑴ 若它的左子树非空,则左子树上所有结点的值均小于根结点的值; ⑵ 若它的右子树非空,则右子树上所有结点的值均大于根结点的值; ⑶ 左、右子树本身又各是一棵二叉排序树。
-
性质
- 左子树结点值 < 根结点值 < 右子树结点值
- 对二叉排序树进行中序遍历,得到递增的有序序列
查找
- 非递归算法 时间复杂度:O(1)
BSTNode *BST_Search(BiTree T, ElemType key) {
while(T != NULL && key != T -> data) {
if(key < T -> data) T = T -> lchild;
else T = T -> rchild;
}
return T;
}
- 递归算法 时间复杂度:O(h)
BSTNode *BST_Search(BiTree T, ElemType key) { // 树结构、关键字
if(T == NULL) return NULL;
if(key < T -> data)
return BST_Search(T -> lchild, key);
else if(key > T -> data)
return BST_Search(T -> rchild, key);
else
return T;
}
插入
int BST_Insert(BiTree &T, ElemType k) { // 树引用、关键字
if(T == NULL) {
T = (BiTree)malloc(sizeof(BSTNode)); // BSTNode指该结点(包含指针和数据)
T -> data = k; // 填充数据
T -> lchild = NULL; T -> rchild = NULL; // 左右子树为NULL
return 1;
} else if(k == T -> data) { // 存在相同数据,插入失败
return 0;
} else if(k < T -> data) { // 插入左子树
return BST_Insert(T -> lchild, k);
} else { // 插入右子树
return BST_Insert(T -> rchild, k);
}
}
构造
-
手动构造 根据性质:左子树结点值 < 根结点值 < 右子树结点值
-
代码实现
void Creat_BST(BiTree &T, ElemType str[], int n) { // 树引用、关键字数组、长度
T = NULL; // 初始为空
int i = 0;
while(i < n) { // 依次插入关键字
BST_Insert(T, str[i]);
}
}
删除
- 删除叶结点,直接删除
- 删除的结点x只有左子树/右子树,让x的子树成为x的父节点的子树
- 删除的结点x既有左子树,又有右子树,让x的直接前驱代替x,转化为(1)或(2)