目录
递归版本:类private内部定义,因为需要显示传参root
二叉搜索树性质
1.若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
2.若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
3.它的左右子树也分别为二叉搜索树
注意事项:
1.搜索树不允许重复冗余数据
2.搜索二叉树中序遍历是有序+去重
3.二叉搜索树不支持修改
4.二叉搜索树也称二叉排序树
二叉搜索树结构
template<class K>
class BSTreeNode
{
BSTreeNode<K>* _left;
BSTreeNode<K>* _right;
K _key;
};
template<class K>
class BSTree
{
typedef BSTreeNode<K> Node;
private:
Node* _root = nullptr;
};
二叉搜索树的查找
从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。
最多查找高度次,到空还没找到,这个值不存在
Insert非递归版本
返回值为bool,防止冗余数据
树为空,则直接新增节点,赋值给root指针
树不空,按二叉搜索树性质查找插入位置,插入新节点
bool Insert(const K& key)
{
if (_root == nullptr)
{
_root = new Node(key);
return true;
}
Node* cur = _root;
Node* parent = nullptr;
while (cur)
{
if (cur->_key > key)
{
parent = cur;
cur = cur->_left;
}
else if(cur->_key < key)
{
parent = cur;
cur = cur->_right;
}
else
{
return false;//值在树中存在,错误
}
}
cur = new Node(key); //单纯写一句这个错误,cur只是局部变量,并没有挂到树中
if (parent->_key < key)
{
parent->_right = cur;
}
else
{
parent->_left = cur;
}
return true;
}
递归版本:类private内部定义,因为需要显示传参root
此处递归插入需要加上&, 如果不加引用此处是局部变量,还需要链接父亲,