1.二叉搜索树
1.1二叉搜索树概念
二叉搜索树又称二叉排序树,它或者是一颗空树,或者具有以下性质的二叉树
- 若它的左子树不为空,则左子树上所有结点的值小于根节点的值
- 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
- 它的左右子树也分别为二叉搜索树

1.2二叉搜索树操作

int a[] = {
8, 3, 1, 10, 6, 4, 7, 14, 13};
1.二叉搜索树的查找
- a. 从根开始比较,查找,比根大则往右边查找,比根小则往左边查找
- b. 最多查找高度次,走到空,还没找到,这个值不存在
2.二叉搜索树的插入
插入的具体过程如下:
- a. 树为空,则直接新增节点,赋值给root指针
- b. 树不为空,按二叉搜索树性质查找插入位置,插入新节点

1.二叉搜索树的删除
首先查找元素是否在二叉搜索树中,如果不存在,则返回,否则要删除的结点可能分下面四种情况 - a. 要删除的结点无孩子结点
- b. 要删除的结点只有左孩子结点
- c. 要删除的结点只有右孩子结点
- d. 要删除的结点有左,右孩子结点
看起来有待删除节点有四种情况,实际情况a可以与情况b或c合并起来,因此真正的删除情况如下
- 情况b: 删除该结点且使被删除节点的双亲结点指向被删除节点的左孩子结点-直接删除
- 情况c: 删除该结点且使被删除节点的双亲结点指向被删除结点的右孩子结点_直接删除
- 情况d: 在它的右子树中寻找中序下的第一个节点(关键码最小),用它的值填补到被删除节点中,再来处理该节点的删除问题_替换法删除

1.3二叉搜索树的实现
template<class T>
struct BSTNode
{
BSTNode(const T& data = T())
: _pLeft(nullptr) , _pRight(nullptr), _data(data)
{
}
BSTNode<T>* _pLeft;
BSTNode<T>* _pRight;
T _data;
};
template<class T>
class BSTree
{
typedef BSTNode<T> Node;
typedef Node* PNode;
public:
BSTree(): _pRoot(nullptr)
{
}
~BSTree();
// 根据二叉搜索树的性质查找:找到值为data的节点在二叉搜索树中的位置
PNode Find(const T& data);
bool Insert(const T& data)
{
// 如果

最低0.47元/天 解锁文章
1107

被折叠的 条评论
为什么被折叠?



