感觉数据结构与算法分析c++版讲的挺好的 在p129附近吧
到时候仔细看看,拷贝构造函数啊等等我都没加进来 里面的递归clone这些
然后在这里学到了 要传递 指针的引用,还有就是先赋给old 再改ptr 再delete
有时间再好好看看吧
template<typename T>
struct Node {
T element;
Node *left;
Node *right;
Node(const T &_ele, Node *_left, Node *_right)
:element(ele), left(_left), right(_right) {}
};
template<typename T>
class BinarySearchTree {
public:
BinarySearchTree();
BinarySearchTree(const BinarySearchTree &rhs);
~BinarySearchTree(); //析构当时我还是挺迷糊的,仔细看看
public:
void insert(const T &obj);
void remove(const T &obj);
private:
Node *root;
Node *findmin(Node *ptr) const;
void insert(const T &obj, Node *&ptr);//重要!! 我们要把函数外面的 Node* 指针给改变,指向新的节点,所以要传递指针的引用
void remove(const T &obj, Node *&ptr);
void makeempty(Node *&ptr);
};
template<typename T>
BinarySearchTree::~BinarySearchTree() {
makeempty(root);
}
template<typename T>
void BinarySearchTree::makeempty(Node *&ptr) {
if (ptr != nullptr) {
makeempty(ptr->left);
makeempty(ptr->right);
delete ptr;
}
ptr = nullptr;
}
template<typename T>
void BinarySearchTree::insert(const T &obj) {
return insert(obj, root);
}
template<typename T>
void BinarySearchTree::insert(const T &obj, Node *&ptr) {
if (ptr == nullptr)
ptr = new Node{ obj,nullptr,nullptr };
else if (obj < ptr->element)
insert(obj, ptr->left);
else if (obj > ptr->element)
insert(obj, ptr->right);
else
;
}
template<typename T>
void BinarySearchTree::remove(const T &obj) {
return remove(obj, root);
}
template<typename T>
void BinarySearchTree::remove(const T &obj, Node *&ptr) {
if (ptr == nullptr)
return;
else if (obj < ptr->element)
remove(obj, ptr->left);
else if (obj > ptr->element)
remove(obj, ptr->right);
else if (ptr->left != nullptr && ptr->right != nullptr) {
ptr->element = findmin(ptr->right)->element;
remove(ptr->element, ptr->right);
}
//书里的 把两个空,左空右不空,左不空右空都考虑到了
else {
Node *old = ptr; //一定要先赋一个old再改ptr 再delete old
ptr = (ptr->left != nullptr) ? ptr->left : ptr->right;
delete old;
}
}