题目三:
解法一:(递归)
解题思路:
二叉搜索树是一个有序树:
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉搜索树
- 确定递归函数的参数和返回值
递归函数的参数传入的就是根节点和要搜索的数值,返回的就是以这个搜索数值所在的节点。
var searchBST = function(root, val) {}
- 确定终止条件
如果root为空,或者找到这个数值了,就返回root节点。
if (root == NULL || root.val == val) return root;
- 确定单层递归的逻辑
看看二叉搜索树的单层递归逻辑有何不同。
因为二叉搜索树的节点是有序的,所以可以有方向的去搜索。
如果root->val > val,搜索左子树,如果root->val < val,就搜索右子树,最后如果都没有搜索到,就返回NULL。
TreeNode* result = NULL;
if (root.val > val) result = searchBST(root.left, val);
if (root.val < val) result = searchBST(root.right, val);
return result;
完整代码:
var searchBST = function(root, val) {
let result = null
if (root === null || root.val === val) return root
if (root.val > val) {
result = searchBST(root.left, val)
}
if (root.val < val) {
result = searchBST(root.right, val)
}
return result
};
解法二:(迭代法)
一提到二叉树遍历的迭代法,可能立刻想起使用栈来模拟深度遍历,使用队列来模拟广度遍历。
对于二叉搜索树可就不一样了,因为二叉搜索树的特殊性,也就是节点的有序性,可以不使用辅助栈或者队列就可以写出迭代法。
对于一般二叉树,递归过程中还有回溯的过程,例如走一个左方向的分支走到头了,那么要调头,再走右分支。
而对于二叉搜索树,不需要回溯的过程,因为节点的有序性就帮我们确定了搜索的方向。
var searchBST = function(root, val) {
while (root !== null) {
if (root.val > val) {
root = root.left
} else if (root.val < val) {
root = root.right
} else {
return root
}
}
return null
};