微信公众号:CurryCoder的程序人生 

业精于勤,荒于嬉;行成于思,毁于随


【LeetCode-700 | 二叉搜索树中的搜索】​_#include





1.题目描述

【LeetCode-700 | 二叉搜索树中的搜索】​_结点_02




2.题解

#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>

using namespace std;

struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};

class Solution
{
public:
    /*
       二叉搜索树是一个有序树,特点如下:
            (1).若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值
            (2).若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
            (3).它的左、右子树也分别为二叉搜索树
    */

    // 递归法:因为要检索二叉树的单条边,因此递归函数需要有返回值!
    // 1.确定函数入参及返回值
    TreeNode *searchBST(TreeNode *root, int val)
    {
        // 2.确定递归终止条件:如果给定的二叉搜索树为空或找到给定的值,则返回root
        if (root == nullptr || root->val == val)
            return root;

        // 3.确定单层递归逻辑:给定值比根节点小,则在左子树中搜索给定值;反之,则在右子树中搜索给定值;
        if (root->val > val)
            return searchBST(root->left, val);
        if (root->val < val)
            return searchBST(root->right, val);

        return nullptr;
    }
};

// 迭代法:一般是使用栈来模拟深度遍历或者使用队列来模拟广度遍历,但是二叉搜索树的节点是有序性的,它确定了搜索的方向,可以不使用辅助栈或者队列
class Solution
{
public:
    TreeNode *searchBST(TreeNode *root, int val)
    {
        while (root != nullptr)
        {
            if (root->val > val)
                root = root->left;
            else if (root->val < val)
                root = root->right;
            else
                return root;
        }
        return nullptr;
    }
};

【LeetCode-700 | 二叉搜索树中的搜索】​_子树_03


觉得不错,请一键三连吧↓