二叉查找树的常用操作

本文详细介绍了二叉查找树的构造函数、递归和迭代查找算法,以及使用值传递和引用传值的插入和删除方法。最后讨论了计算n个结点且关键词从1到n的二叉查找树数量的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、结点的构造

struct BSTnode {
	int key;
	BSTnode* left;
	BSTnode* right;
	BSTnode(int K) {
		key = K;
		left = right = NULL;
	}
};

2、查找算法

2.1 递归版本
BSTnode* Search(BSTnode* root, int K) {
	if (root == NULL || root->key == K) return root;
	if (K < root->key) return Search(root->left, K);
	else return Search(root->right, K);
}

例题:LeetCode 700

2.2 迭代版本
BSTnode* Search2(BSTnode* root, int K) {
	BSTnode* p = root;
	while (p != NULL) {
		if (K < p->key) p = p->left;
		else if (K > p->key) p = p->right;
		else return p;
	}
	return NULL;
}

3、插入算法

3.1 引用传值
void insert(BSTnode* &root, int K) {
	if (root == NULL) root = new BSTnode(K);
	else if (K < root->key) insert(root->left, K);
	else if (K > root->key) insert(root->right, K);
}
3.2 值传递
BSTnode* Insert(BSTnode* root, int K) {
	if (root == NULL) root = new BSTnode(K);
	else if (K < root->key) root->left = Insert(root->left, K);
	else if (K > root->key) root->right = Insert(root->right, K);
	return root;
}

例题:LeetCode 701

4、删除算法

4.1 引用传值
void remove(BSTnode* &root, int K) {
	if (root == NULL) return;
	if (K < root->key) remove(root->left, K);//在左子树删K
	else if (K > root->key) remove(root->right, K);//在右子树删K
	else if (root->left != NULL && root->right != NULL) {
		BSTnode* s = root->right;
		while(s->left != NULL){
			s = s->left;
		}
		root->key = s->key;//s为t右子树中根序列第一个节点
		remove(root->right, s->key);
	}
	else {
		BSTnode* oldroot = root;
		root = (root->left != NULL) ? root->left : root->right;
		delete oldroot;
	}
}
4.2 值传递
BSTnode* deleteNode(BSTnode* root, int K) {
	if (root == NULL) return root;
	if (K < root->key) {
		root->left = deleteNode(root->left, K);
	}
	else if (K > root->key) {
		root->right = deleteNode(root->right, K);
	}
	else if (root->left != NULL && root->right != NULL) {
		BSTnode* s = root->right;
		while(s->left != NULL){
			s = s->left;
		}
		root->key = s->key;
		root->right = deleteNode(root->right, s->key);
	}
	else {
		BSTnode* oldroot = root;
		root = (root->left != NULL) ? root->left : root->right;
		delete oldroot;
	}
	return root;
}

例题:LeetCode 450

5、统计由n个结点组成且结点关键词为1到n的二叉查找树有多少种

int numTrees(int n) {
	long long C = 1;
	for (int i = 2; i <= n; i++) {
		C = C * 2 * (2 * i - 1) / (i + 1);
	}
	return C;
}

例题:LeetCode 96

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值