二叉搜索树的查找

给定一个二叉搜索树,查找比指定target大的最小值&&查找比指定值target小的最大值

//给一个二叉搜索树,查找比指定值target大的最小值;查找比指定值target小的最大值
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

//定义树结构
typedef struct TreeNode {
	int val;
	TreeNode *left;
	TreeNode *right;
	struct TreeNode(int x) :val(x), left(nullptr), right(nullptr) {}
	struct TreeNode(int x, TreeNode *left, TreeNode *right) :val(x), left(left), right(right) {}
}*Tree;

//查找比指定值target大的最小值
int findBigger(Tree root, int target) {
	//根据二叉搜索树的特性
	if (root == nullptr) return 0;  // 确保树中节点的值不存在0
	if (root->val <= target) {
		//这里是为了从根节点往下找,直到找到第一个比target大的节点
		return findBigger(root->right, target);
	}
	else {
		//找到第一个比target大的节点node0,比target大的最小值肯定在node0的左子树内,
		//查找左子树,返回值为0时说明左子树没有结果,则返回当前节点值
		int node0val = findBigger(root->left, target);
		return (node0val == 0) ? root->val : node0val;
	}
}
// 查找比指定值target小的最大值
int findsamllmax(Tree root, int target) {
	if (root == nullptr) return 0;
	if (root->val >= target) {
		//找到第一个比target小的节点
		return findsamllmax(root->left, target);
	}
	else {
	// 找到第一个比target小的节点node1后,比target小的最小值肯定在node1的右子树内,
    // 所以查找右子树,返回值为0说明右子树没有结果,则返回当前节点的值.
		int node1val = findsamllmax(root->right, target);
		return (node1val == 0) ? root->val : node1val;
	}
}


int main() {
	//新建一棵二叉搜索树
	Tree root = new TreeNode(5);
	Tree root1 = new TreeNode(4);
	Tree root2 = new TreeNode(6);
	Tree root3 = new TreeNode(3.5);
	Tree root4 = new TreeNode(4.5);
	Tree root5 = new TreeNode(5.5);
	Tree root6 = new TreeNode(6.5);
	root->left = root1;
	root->right = root2;
	root1->left = root3;
	root1->right = root4;
	root2->left = root5;
	root2->right = root6;
	//查找比target大的最小值
	int res1 = findBigger(root, 4.5);
	cout << res1 << endl;
	//查找比target小的最大值
	int res2 = findsamllmax(root, 5);
	cout << res2 << endl;

	system("pause");
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值