二叉搜索树
二叉搜索树是一颗二叉树,可能为空。一棵非空的二叉搜索树满足以下特征:
1).每个元素有一个关键字,并且任意两个元素的关键字都不同;因此,所有的关键字都是唯一的(如果有重复的话,这样的二叉树称为有重复的二叉搜索树)。
2).在根节点的左子树中,元素的关键字(如果有的话)都小于根节点的关键字。
3).在根节点的右子树中,元素的关键字(如果有的话)都大于根节点的关键字。
4).根节点的左右子树也是二叉搜索树。
二叉搜索树的渐近性能可以和跳表媲美,在查找、插入、删除操作的所需平均时间为O(log n),在最坏情况下则为O(n)。在连续有序的插入情况下即为最坏情况,这时搜索树的上述操作从O(log n)退化为O(n)。
具体实现
值得注意的是,插入操作中,新插入的节点永远都是叶节点。而对于删除操作,如果要删除的节点同时有左右子树,则需要重新调整搜索树,这里的做法是找到最接近要删除节点关键字的节点,也就是以该节点左孩子为根的搜索树中最大的元素或者是以该节点右孩子为根的搜索树中最小的元素(这里实现选择前者),用它的值代替要删除节点的值,然后删除这个最接近的节点;如果要删除的节点最多有一个孩子节点,则不必调整,只需要调整它的父节点的指针即可。详细思考和思想见注释。
#pragma once
#include "bsTreeADT.h"
#include "..//..//..//ch11/Tree/Tree/binaryTreeNode.h"
#include <iostream>
using std::cout; using std::ends; using std::endl;
//暂时只实现常用的核心功能 如插入 查找 删除等 其他拷贝控制成员可以参考Ch11二叉树的实现
//另外关于非递归拷贝构造一棵二叉树的方法--使用队列层次拷贝
template <typename K,typename V>
class binarySearchTree :public bsTree<K, V> {
public:
binarySearchTree():root(nullptr),treeSize(0){
}
~binarySearchTree() {
destory(root); }
bool empty()const {
return treeSize == 0; }
int size()const {
return treeSize; }
std::pair<const K, V>* find(const K& _Key) const;
void insert(const std::pair<const K, V>& _pair);
void erase(const K& _Key);
void ascendingOutput()const {
inOrderOutput(root); }//升序输出二叉搜索树 也就是中序遍历二叉树
private:
binaryTreeNode<std::pair<const K, V>>* root;
int treeSize;
private:
void destory(binaryTreeNode