数据结构与算法——二叉查找树类的C++实现

二叉树的平均深度为O(logN);
二叉查找树在二叉树的基础上,增加的性质为:对于树中每一个结点X,它的左子树中所有项的值小于X中的项,而它的右子树中所有项的值大于X中的项。

该二叉查找树结点的数据结构:


struct BinaryNode{
    Comparable element;//结点的值
    BinaryNode * left;//结点的左孩子
    BinaryNode * right;//结点的右孩子
    int num;//相同值的结点出现的次数,如果不考虑重复元素的话,该成员可以省去
    BinaryNode(const Comparable & e, BinaryNode* lt, BinaryNode* rt, int n):element(e), left(lt), right(rt), num(n){}
};

该结点数据结构其实是一个结点类。

该二叉查找树的主要成员函数:

BinarySearchTree(){root = NULL;}//构造函数
BinarySearchTree(vector<int> & v);//构造函数
BinarySearchTree(const BinarySearchTree & rhs);//复制构造函数
const BinarySearchTree & operator=(const BinarySearchTree & rhs);//赋值运算符重载
~BinarySearchTree();//析构函数

void preOrderPrintTree() const;//从小到大打印该二叉查找树
void inOrderPrintTree() const;//从大到小打印该二叉查找树

Comparable findMin() const;//查找最小值
Comparable findMax() const;//查找最大值
bool contains(const Comparable & x) const;//判断该二叉查找树是否包含值为x的结点
bool isEmpty() const;//判断该二叉查找树是否为空 
void makeEmpty();//清空该二叉查找树

void insert(const Comparable & x);//插入结点
void remove(const Comparable & x);//移除结点值为x的结点

主要成员函数介绍:

void remove(const Comparable & x);//移除结点值为x的结点

/****************************************************************
*   函数名称:remove(const Comparable & x) 
*   功能描述: 移除结点
*   参数列表: x -- 要移除的结点的值 
*   返回结果:void
*****************************************************************/
template<typename Comparable>
void BinarySearchTree<Comparable>::remove(const Comparable & x)
{
    remove(x, root);    
}

template<typename Comparable>
void BinarySearchTree<Comparable>::remove(const Comparable & x, BinaryNode * &t) const
{
    if(t == NULL)
        return;

    if(x < t->element)
        remove(x, t->left);
    else if(x > t->element)
        remove(x, t->right);
    else if((t->left != NULL) && (t->right != NULL)){//该结点有两个儿子的时候,将该结点右子树的最小结点覆盖该结点的值,然后再删除那个最小结点
        t->element = findMin(t->right);
        remove(t->element, t->right);
    }
    else {//该结点只有一个儿子的时候,将儿子放在当前结点的位置。用另一个指针保存当前结点,然后删除该结点;此时也包括该结点为叶子结点的情况
        BinaryNode * oldCurrentNode = t;
        t = (t->left == NULL) ? t->right : t->left;
        delete oldCurrentNode;
    }
}






下面的main函数是对remove成员函数的测试,用的就是上面两个图:

int main()
{
    BinarySearchTree<int> tree;
    tree.insert(6);
    tree.insert(2);
    tree.insert(1);
    tree.insert(4);
    tree.insert(3);
    tree.insert(8);

    tree.preOrderPrintTree();
    tree.remove(4);
    tree.preOrderPrintTree();

    BinarySearchTree<int> tree2;
    tree2.insert(6);
    tree2.insert(2);
    tree2.insert(1);
    tree2.insert(5);
    tree2.insert(3);
    tree2.insert(4);
    tree2.insert(8);
    tree2.preOrderPrintTree();
    tree2.remove(2);
    tree2.preOrderPrintTree();


    return 0;
}


下面是该二叉查找树类的源代码:



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值