算法7二叉查找树

感觉数据结构与算法分析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;
	}
}

猜你喜欢

转载自blog.csdn.net/speargod/article/details/88084224