700. 二叉搜索树中的搜索

700. 二叉搜索树中的搜索

题目链接:700. 二叉搜索树中的搜索(简单)

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

例如,

给定二叉搜索树:

      4
      / \
    2   7
    / \
  1   3

和值: 2

你应该返回如下子树:

      2     
    / \  
  1   3

在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL

解题思路

二叉搜索树是一种特殊的二叉树,利用它的性质能够优化算法。

二叉树的性质:

  • 左子树所有节点的值都小于根节点的值

  • 右子树所有节点的值都大于根绝点的值

  • 左子树和右子树也是二叉搜索树

递归

因为二叉树的节点是有顺序的,因此能够确定搜索的方向。如果root->val > val,那就从左子树去查找;如果root->val < val,那就从右子树去查找。

代码(C++)

//递归法
class Solution1 {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        if (root == nullptr) return nullptr;
        if (root->val == val) return root;
        if (root->val > val) return searchBST(root->left , val);
        if (root->val < val) return searchBST(root->right, val);
        return nullptr;
    }
};

代码(JavaScript)

/**
 * @param {TreeNode} root
 * @param {number} val
 * @return {TreeNode}
 */
//递归
var searchBST = function(root, val) {
    if (root === null || root.val === val) return root;
    if (root.val > val) return searchBST(root.left, val);
    if (root.val < val) return searchBST(root.right, val);
    return null;
};

迭代

二叉搜索树的特性能够确定搜索的路线,所以在迭代过程中不需要栈或者队列的辅助。

代码(C++)

//迭代法(由于二叉搜索树的有序性,所以不用栈或队列)
class Solution2 {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        TreeNode* node = root;
        while (node != nullptr) {
            if (node->val == val) return node;
            if (node->val > val) node = node->left;
            if (node->val < val) node = node->right;
        }
        return node;
    }
};

代码(JavaScript)

/**
 * @param {TreeNode} root
 * @param {number} val
 * @return {TreeNode}
 */
//迭代
var searchBST = function(root, val) {
    while(root != null) {
        if (root.val === val) return root;
        else if (root.val > val) root = root.left;
        else if (root.val < val) root = root.right;
    }
    return null;
};

 

原文地址:https://www.cnblogs.com/wltree/p/15679594.html