何为二叉查找树?
二叉查找树也称为二叉搜索树或二叉排序树。二叉排序树的节点包含键值key。二叉排序树或者是一棵空树,否则要求:
1.若它的左子树不为空,那么左子树上所有节点的key都小于根节点的key
2.若它的右子树不为空,那么右子树上所有节点的key都大于根节点的key
3.它的左右子树也分别为二叉排序树
从定义得,二叉查找树中没有重复key值的节点。
二叉查找树的构建
节点结构
template <typename T>
struct BSNode
{
//初始化 只赋予权值
BSNode(T t):value(t),lchild(NULL),rchild(NULL) {}
//BSNode() = default;
T value; //节点的值
BSNode<T>* lchild; //左孩子
BSNode<T>* rchild; //右孩子
BSNode<T>* parent; //节点的双亲
};
二叉查找树的抽象数据结构
template <typename T>
class BSTree
{
public:
//初始化为空树
BSTree():root(NULL){}
//外部接口
void preOrder(); //前序遍历
void inOrder(); //中序遍历
void postOrder(); //后序遍历
BSNode<T>* search_recursion(T key); //递归查找指定节点
BSNode<T>* search__iterator(T key); //迭代查找指定节点
T search_maxnum(); //查找最大元素
T search_minnum(); //查找最小元素
void insert(T key); //插入指定结点
void remove(T key); //删除指定结点
void destory(); //销毁二叉树
void print(); //打印二叉树
private:
BSNode<T>* root; //根节点
//内部接口
void preOrder(BSNode<T>* pnode);
void inOrder(BSNode<T>* pnode);
void postOrder(BSNode<T>* pnode);
BSNode<T>* search(BSNode<T>* & p,T key);
void remove(BSNode<T>* pnode,T key);
T search_maxnum(BSNode<T>* pnode);
T search_minnum(BSNode<T>* pnode);
void destory(BSNode<T>* &pnode);
};
具体实现
1. 插入节点
假设我们要为数组 a[] = {10 , 5 , 15 , 6 , 4 , 16 }构建一个二叉查找树,我们按顺序逐个插入元素。
插入过程:
- 如果是空树,则创建一个新节点,新节点作为根,因此以元素10构建的节点为该二叉查找树的根。
- 插入5,5比10小,与10的左孩子节点进行比较,10的左孩子节点为空,进行插入。
- 插入15,15比10大,与10的右孩子节点进行比较,10的右孩子节点为空,进行插入。
- 插入6,