一、概念
二叉排序树:Binary Sort Tree(BST),也称二叉查找树
二叉排序树为非空树时有如下特点:
- 若左子树非空,则左子树上所有结点值均
小于
其根结点值- 若右子树非空,则右子树上所有结点值均
大于
其根结点值- 其左、右子树本身也是一棵二叉排序树
- 没有键值相等的结点
对该树进行中序遍历(LDR) : 9 11 23 45 58 76
结论 :中序遍历二叉排序树时会得到一个递增的有序序列
二、性质
节点定义
template<class T>
struct BSTNode{
T value;
BSTNode<T> *leftSon;
BSTNode<T> *rightSon;
BSTNode(T value,BSTNode<T> *leftSon,BSTNode<T> *rightSon){
this->value = value;
this->leftSon = leftSon;
this->rightSon = rightSon;
}
};
2.1 查找
- 二叉树非空时,查找根结点,若值相等则查找成功,
- 若不相等,当值小于根结点值时,查找左子树;大于根结点值时,查找右子树
- 查找到叶节点仍未找到,查找失败
查找23 : 因为23<45
则查找左子树;因为23>11
则查找右子树;23=23
则查找成功
查找47 : 因为47<45
则查找右子树;因为47<58
则查找左子树;左子树为空,则查找失败
//查找
template<class T>
BSTNode<T> *searchBST(BSTNode<T> *root,T value){
//当前节点为空,说明未找到
if(root == nullptr){
return nullptr;
}
if(root->value == value){
return root;
}
//查找左子树
if(root->value > value){
return searchBST(root->lchind,value);
}
//查找右子树
if(root->value < value){
return searchBST(root->rchind,value);
}
}
2.2 插入
- 若二叉排序树为空,直接插入结点;
- 若二叉排序树非空,当值
小于
根结点时,插入左子树
;当值大于
根结点时,插入右子树
;- 若等于根结点时不进行插入
新插入的结点总是叶子结点
插入15 : 因为15<45
则选择左子树;因为15>11
则选择右子树;15<23
则选择左子树;左子树为空,则插入
template<class T>
BSTNode<T> *insertBST(BSTNode<T> *root,T value){
//当前节点为空,说明是叶子节点,可以插入
if(root == nullptr){
root = new BSTNode<T>(value,nullptr,nullptr);
return root;
}
//值小于根结点时,插入根节点的左子树
if(root->value > value){
root->leftSon = insertBST(root->leftSon,value);
}
//值大于根结点时,插入根节点的右子树
if(root->value < value){
root->rightSon = insertBST(root->rightSon,value);
}
return root;
}
2.3 构建
使初始根节点为空,进行插入操作即可
template<class T>
void