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

     

  • 相关阅读:
    源文件声明规则
    JavaBean
    ffmpeg错误:Invalid UE golomb code
    利用android studio 生成 JNI需要的动态库so文件
    Error: Your project contains C++ files but it is not using a supported native build system.
    Andriod studio 目录结构
    ubuntu 16.04扩充root 分区
    错误: H.264 bitstream malformed, no startcode found,
    CIDR
    Qt之QComboBox定制(二)
  • 原文地址:https://www.cnblogs.com/wltree/p/15679594.html
Copyright © 2020-2023  润新知