二叉搜索树API

struct BinarySearchTree {
	Node* search(Node* node, int key) {
		while (nil != node && key != node->key) {
			if (key < node->key) {
				node = node->leftChild;
			} else {
				node = node->rightChild;
			}
		}
		return node;
	}
	Node* minimum(Node* node) {
		while (nil != node->leftChild) {
			node = node->leftChild;
		}
		return node;
	}
	Node* maximum(Node* node) {
		while (nil != node->rightChild) {
			node = node->rightChild;
		}
		return node;
	}
	Node* predecessor(Node* node) {
		if (nil != node->leftChild) {
			return maximum(node->leftChild);
		}
		while (nil != node->parent && node == node->parent->leftChild) {
			node = node->parent;
		}
		return node->parent;
	}
	Node* successor(Node* node) {
		if (nil != node->rightChild) {
			return minimum(node->rightChild);
		}
		while (nil != node->parent && node == node->parent->rightChild) {
			node = node->parent;
		}
		return node->parent;
	}
	void insert(Node* node) {
		Node* father = nil;
		Node* current = root;
		while (nil != current) {
			father = current;
			if (node->key < current->key) {
				current = current->leftChild;
			} else {
				current = current->rightChild;
			}
		}
		node->parent = father;
		if (nil == father) {
			root = node;
		} else if (node->key < father->key) {
			father->leftChild = node;
		} else {
			father->rightChild = node;
		}
	}
	void transplant(Node* des, Node* src) {
		if (nil == des->parent) {
			root = src;
		} else if (des == des->parent->leftChild) {
			des->parent->leftChild = src;
		} else {
			des->parent->rightChild = src;
		}
		if (nil != src) {
			src->parent = des->parent;
		}
	}
	void del(Node* node) {
		if (nil == node->leftChild) {
			transplant(node, node->rightChild);
		} else if (nil == node->rightChild) {
			transplant(node, node->leftChild);
		} else {
			Node* suc = minimum(node->rightChild);
			if (suc->parent != node) {
				transplant(suc, suc->rightChild);
				suc->rightChild = node->rightChild;
				suc->rightChild->parent = suc;
			}
			transplant(node, suc);
			suc->leftChild = node->leftChild;
			suc->leftChild->parent = suc;
		}
	}
};

  

posted @ 2017-09-18 15:58  Mr.Struggle  阅读(169)  评论(0编辑  收藏  举报