二叉搜索树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;
		}
	}
};

  

转载于:https://www.cnblogs.com/lvcoding/p/7543530.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值