[LeetCode] Search in a Binary Search Tree 二叉搜索树中搜索

 

Given the root node of a binary search tree (BST) and a value. You need to find the node in the BST that the node's value equals the given value. Return the subtree rooted with that node. If such node doesn't exist, you should return NULL.html

For example, node

Given the tree:
        4
       / \
      2   7
     / \
    1   3

And the value to search: 2

You should return this subtree:函数

      2     
     / \   
    1   3

In the example above, if we want to search the value 5, since there is no node with value 5, we should return NULL.post

Note that an empty tree is represented by NULL, therefore you would see the expected output (serialized tree format) as [], not null.this

 

这道题让咱们搜索一个二叉搜索树,既然是二叉搜索树,而不是普通的二叉树,那么咱们确定要利用二叉搜索树特定的性质来解题,即左<根<右。那么就是说任意一个结点的左子树中的全部结点均小于当前结点,其右子树中的全部结点均大于当前结点。那么这不就是一个自然的二分么,当仁不让的二分搜索法呼之欲出啊。首先判空,若是当前结点不存在,直接返回空。若是当前结点值等于目标值,返回当前结点。接下来就看若是当前结点值大于目标值,则对左子结点调用递归函数,不然就对右子结点调用递归函数,参见代码以下:url

 

解法一:spa

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

 

咱们也能够使用迭代形式来解,使用一个while循环,思路都是同样的,若是当前结点存在,且结点值不等于目标值,那么若结点值大于目标值,则当前结点指向其左子结点,不然指向其右子结点,参见代码以下:code

 

解法二:orm

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        while (root && root->val != val) {
            root = (root->val > val) ? root->left : root->right;
        }
        return root;
    }
};

 

相似题目:htm

Closest Binary Search Tree Value

Insert into a Binary Search Tree

 

参考资料:

https://leetcode.com/problems/search-in-a-binary-search-tree/

https://leetcode.com/problems/search-in-a-binary-search-tree/discuss/139687/Concise-iterative-solution-(C%2B%2B)

https://leetcode.com/problems/search-in-a-binary-search-tree/discuss/149274/Java-beats-100-concise-method-using-recursion-and-iteration

 

LeetCode All in One 题目讲解汇总(持续更新中...)