代码随想录二刷 | 二叉树 |二叉搜索树中的搜索

代码随想录二刷 | 二叉树 |二叉搜索树中的搜索

题目描述

700.二叉搜索树中的搜索

给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。

例如,
在这里插入图片描述
在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。

解题思路

二叉搜索树是一个有序树:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉搜索树

这就决定了,二叉搜索树,递归遍历和迭代遍历和普通二叉树都不一样。

本题,其实就是在二叉搜索树中搜索一个节点。

递归法

  1. 确定递归函数的参数和返回值
    递归函数传入的就是根节点和要搜索的数值,返回的就是这个搜索值所在的节点。

    TreeNode* searchBST(TreeNode* root, int val) 
    
  2. 确定递归的终止条件
    如果root == NULL,或者找到这个数值了,就返回root节点

    if (root == NULL || root->val == val) return root;
    
  3. 确定单层递归的逻辑
    因为二叉搜索树的节点是有序的,所以可以有方向的去搜索。

    如果root->val > val,搜索左子树;

    如果root->val < val,就搜索右子树;

    最后如果都没有搜索到,就返回NULL。

    TreeNode* result = NULL;
    if (root->val > val) result = searchBST(root->left, val);
    if (root->val < val) result = searchBST(root->right, val);
    return result;
    

迭代法

因为二叉搜索树的特殊性,也就是节点的有序性,可以不使用辅助栈或者队列就可以写出迭代法。

对于一般二叉树,递归过程中还有回溯的过程,例如走一个左方向的分支走到头了,那么要调头,在走右分支。

而对于二叉搜索树,不需要回溯的过程,因为节点的有序性就帮我们确定了搜索的方向。

例如要搜索元素为3的节点,我们不需要搜索其他节点,也不需要做回溯,查找的路径已经规划好了。

中间节点如果大于3就向左走,如果小于3就向右走,如图:

在这里插入图片描述

代码实现

递归法

class Solution {
public:
	TreeNode* searchBST(TreeNOde* root, int val) {
		if (root == NULL || root->val == val) return root;
		TreeNode* result = NULL:
		if (root->val > val) result = searchBST(root->left, val);
		if (root->val < val) result = searchBST(root->right, val);
		return result; 
	}
};

迭代法

class Solution {
public:
	TreeNode* searchBST(TreeNode* root, int val) {
		while (root != NULL) {
			if (root->val > val) root = root->left;
			else if (root->val < val) root = root->right;
			else return root;
		}
		return NULL:
	}
};
  • 27
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值