1、二叉搜索树的概念
二叉搜索树又叫做二叉排序树,他或者是一棵空树,或者具有以下性质:
若他的左子树不为空,则左子树的所有节点的值都小于根节点的值,
若他的右子树不为空,则右子树的所有节点的值都大于根节点的值,
他的左右子树也分别为二叉搜索树;
2、二叉搜索树的操作
int a[] = {8, 3, 1, 10, 6, 4, 7, 14, 13};
1.二叉搜索树的查找
从根节点开始找,比根大往右边查找,比根小往左边查找,最多查找高度次,走到空还没找到,则该值不存在;
2.二叉搜索树的插入
若树为空,则新增节点,赋值给root指针,
若树不为空,按二叉搜索树查找插入位置,插入新节点
3.二叉搜索树的删除
首先查找元素是否在二叉搜索树中,如果不存在,则返回,如果存在,则分为以下四种情况:
a. 要删除的结点无孩子结点b. 要删除的结点只有左孩子结点c. 要删除的结点只有右孩子结点d. 要删除的结点有左、右孩子结点
其实a情况可以和b c 情况合并起来,这样我们只需要考虑三种删除方式:
情况b: 删除该节点,并使该节点的父亲节点指向删除节点的左节点
情况c:删除该节点,并使该节点的父亲节点指向删除节点的右节点
情况d:替换法,找到该节点右子树的最小节点或者左子树的最大节点,与该节点替换,然后删除右子树的最小节点或左子树的最大节点;
4.二叉搜索树的实现
#pragma once
#include<iostream>
#include<string>
using namespace std;
namespace key
{
template<class K>
struct BSTreeNode
{
BSTreeNode<K>* _left;
BSTreeNode<K>* _right;
K _key;
BSTreeNode(const K& key)
:_left(nullptr)
,_right(nullptr)
,_key(key)
{ }
};
template<class K>
class BSTree
{
typedef BSTreeNode<K> Node;
public:
bool Insert(const K& key)
{
if (_root == nullptr)
{
_root = new Node(key);
return true;
}
Node* parent = nullptr;
Node* cur = _root;
while (cur)
{
if (cur->_key < key)
{
parent = cur;
cur = cur->_right;
}
els