使用C++实现二叉搜索树的数据结构

本文介绍了如何使用C++实现二叉搜索树,包括删除节点的策略、中序遍历的特性,以及多态的应用。还讨论了二叉搜索树的平衡性问题,指出在特定情况下可能会退化为链表,导致查找效率降低。
摘要由CSDN通过智能技术生成

      需要注意的地方:

           ①二叉搜索树删除一个指定结点R,若R为叶子结点,则将R的父结点中指向R的指针改为指向nullptr;若R的左右子结点一个为空,一个非空,则将R的父结点中指向R的指针改为指向R的非空子结点;若R有两个非空子结点,则找出R的右子树中的最小值结点,将其删除并将R的值置为该最小值结点的值。

           ②对二叉搜索树进行中序遍历,将得到按升序排序的输出结果。

           ③使用了多态,二叉搜索树结点类BSTNode继承自抽象类BinNode(二叉树结点类)。

           ④二叉搜索树不是自平衡的,二叉搜索树的平衡性取决于结点的插入顺序,在极端情况二叉搜索树会退化成链表,查找元素的时间复杂度会退化为O(N)。

 

      代码如下,写在头文件中:

  1 #ifndef BST_H
  2 #define BST_H
  3 
  4 #include <iostream>
  5 #include <queue>
  6 
  7 
  8 /************************************************************************/
  9 /* 抽象二叉树结点类                                                     */
 10 /************************************************************************/
 11 template <typename Val>
 12 class BinNode
 13 {
 14 public:
 15     virtual ~BinNode() {}
 16     virtual bool IsLeaf() const = 0;
 17     virtual Val GetValue() const = 0;
 18     virtual void SetValue(const Val &val_) = 0;
 19     virtual BinNode* GetLeftChild() const = 0;
 20     virtual void SetLeftChild(BinNode *lc) = 0;
 21     virtual BinNode* GetRightChild() const = 0;
 22     virtual void SetRightChild(BinNode *rc) = 0;
 23     virtual void InOrderTraverse() const = 0;
 24 };
 25 
 26 
 27 /************************************************************************/
 28 /* 二叉搜索树结点类                                                     */
 29 /************************************************************************/
 30 template <typename Key, typename Val>
 31 class BSTNode : public BinNode<Val>
 32 {
 33 public:
 34     BSTNode()
 35         : key(), val(), left_(nullptr), right_(nullptr) {}
 36     BSTNode(const Key &key_, const Val &val_, BSTNode *lc = nullptr, BSTNode *rc = nullptr)
 37         : key(key_), val(val_), left_(lc), right_(rc) {}
 38     ~BSTNode() {}
 39     bool IsLeaf() const { return (left_ == nullptr) && (right_ == nullptr); } //判断是否为叶结点
 40     Key GetKey() const { return key; }
 41     void SetKey(const Key &key_) { key = key_; } //删除结点时用到,其他情况下不可对key值做修改
 42     Val GetValue() const { return val; }
 43     void SetValue(const Val &val_) { val = val_; }
 44     BSTNode* GetLeftChild() const { return left_; }
 45
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值