二叉树_题目28:700. 二叉搜索树中的搜索

66 阅读3分钟

题目28:700. 二叉搜索树中的搜索

700. 二叉搜索树中的搜索

同类题目

前置知识

二叉搜索树(Binary Search Tree) :也叫做二叉查找树、有序二叉树或者排序二叉树。是指一棵空树或者具有下列性质的二叉树:

  • 如果任意节点的左子树不为空,则左子树上所有节点的值均小于它的根节点的值。
  • 如果任意节点的右子树不为空,则右子树上所有节点的值均大于它的根节点的值。
  • 任意节点的左子树、右子树均为二叉搜索树。

题目描述

  • 给定二叉搜索树(BST)的根节点 root 和一个整数值 val

    你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null

    示例 1:

     输入:root = [4,2,7,1,3], val = 2
     输出:[2,1,3]
    

    示例 2:

     输入:root = [4,2,7,1,3], val = 5
     输出:[]
    

    提示:

    • 树中节点数在 [1, 5000] 范围内
    • 1 <= Node.val <= 107
    • root 是二叉搜索树
    • 1 <= val <= 107

思路分析

递归法

二叉搜索树的查找步骤

在二叉搜索树中查找值为 val 的节点,步骤如下

  • 如果二叉搜索树为空,返回空指针nullptr

  • 如果二叉搜索树不为空,将值val与二叉搜索树根节点的值root.val进行比较

    • 如果 val==root.val,返回被查找到的节点。
    • 如果 val<root.val,递归查找左子树。
    • 如果 val>root.val,递归查找右子树。

程序代码

方法一

 // https://leetcode.cn/problems/search-in-a-binary-search-tree/description/
 // 700. 二叉搜索树中的搜索
 ​
 #include<iostream>
 #include<vector>
 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:
     TreeNode* searchBST(TreeNode* root, int val) {
         if(root == nullptr || root->val == val)
         {
             return root;
         }
 ​
         if(root->val > val)
         {
             return searchBST(root->left,val);
         }else
         {
             return searchBST(root->right,val);
         }
         return nullptr;
     }
 };

复杂度分析

时间复杂度O(N),一共有 N个节点,最坏情况下二叉搜索树是一条链,且要找的元素比链末尾的元素值还要小(大),这种情况下我们需要递归N次。

空间复杂度O(N) ,递归栈的开销占用 O(N)

思路分析

迭代法

对于二叉搜索树使用迭代法巨爽无比,因为二叉搜索树节点是有序性,可以不使用辅助栈或者队列。

普通二叉树,递归搜索的过程中需要有回溯的过程,因为,从一个方向递归到头后找不到,那么就需要回头走另一个分支方向。

程序代码

方法二

 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;
     }
 };

复杂度分析

时间复杂度O(N),一共有 N个节点,hash 占用 O(N),递归占用O(N)

空间复杂度O(1)

更多相关知识:github.com/pingguo1987…