二叉搜索树
二叉搜索树定义
二叉搜索树也称为二叉查找树、二叉排序树,是一种插入、删除、查找操作性能都不错的数据结构
二叉搜索树首先还是一棵二叉树,但是这个二叉树有一些特点:对于树中的每个结点,
- 如果左子树存在,那么左子树中所有结点的值都小于该结点的值
- 如果右子树存在,那么右子树中所有结点的值都大于该结点的值
- 树中没有值相等的结点
下图就是一棵二叉搜索树,可见满足上述二叉搜索树的特点
二叉搜索树实现
二叉搜索树的结构定义
二叉搜索树不一定是一棵完全二叉树,所有不能使用顺序存储结构来实现,而是采用链式存储结构来实现
template<typename T>
class BinarySearchTree : copyable {
private:
struct Node {
T data;
Node *left;
Node *right;
Node(T val) : data(val), left(nullptr), right(nullptr){}
};
public:
BinarySearchTree() : m_root(nullptr), m_size(0){}
BinarySearchTree(const BinarySearchTree &other){ /* TODO */ }
~BinarySearchTree(){
if(m_root == nullptr){
return;
}
std::queue<Node*> q;
q.push(m_root);
Node *cur;
while(!q.empty()){
cur = q.front();
q.pop();
if(cur->left){
q.push(cur->left);
}
if(cur->right){
q.push(cur->right);
}
delete cur;
}
}
int size() const {
return m_size;
}
bool empty() const {
return m_size == 0;
}
/**
* @brief 插入结点(迭代)
*/
void insert(T data);
/**
* @brief 插入结点(递归)
*/
void insert_recursive(T data);
/**
* @brief 查找(递归)
* @return 成功找到返回true,否则返回false
*/
bool find(T data);
/**
* @brief 查找(迭代)
* @return 成功找到返回true,否