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