需要注意的地方:
①二叉搜索树删除一个指定结点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