代码随想录 700.二叉搜索树中的搜索

知识点:
1.二叉搜索树:二叉搜索树是一个有序树。
(1)如果它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值;
(2)如果它的右子树不为空,则右子树上所有节点的值均大于它的根节点的值;
(3)它的左、右子树也分别为二叉搜索树。
(4)由前三条得,二叉搜索树的递归遍历、迭代遍历均与普通二叉树不一样。
2.因为二叉搜索树具有有序性。所以:
(1)二叉搜索树在递归过程中不需要回溯,因为节点的有序性已经帮助我们确定了搜索的方向。
(2)二叉搜索树可以不使用栈或队列直接写出迭代法。
题目要求:在二叉搜索树中搜索一个节点。
方法一:利用二叉搜索树的特点优化递归。
1.确定递归函数的参数和返回值:参数是传入的根节点和要搜索的整数值;返回值是以这个搜索数值所在的节点。
TreeNode searchBST(TreeNode root, int val)2.确定终止条件:如果root为空,或者找到这个数值,就返回root节点。
if (root == null || root.val == val) {return root;}3.确定单层递归的逻辑:因为二叉搜索树的节点是有序的,所以可以有方向的去搜索。
(1)如果要找的节点值<根节点对应值,搜索左子树;
(2)如果要找的节点值>根节点对应值,搜索右子树;
(3)最后如果都没有搜索到,返回null。
if (val < root.val) {return searchBST(root.left, val);} else {return searchBST(root.right, val);}附代码:
class Solution {public TreeNode searchBST(TreeNode root, int val) {if(root == null || root.val == val){return root;}if(val < root.val){return searchBST(root.left,val);}if(val > root.val){return searchBST(root.right,val);}return null;}
}方法二:普通递归。
class Solution {public TreeNode searchBST(TreeNode root, int val) {if(root == null || root.val == val){return root;}TreeNode left = searchBST(root.left,val);if(left != null){return left;}return searchBST(root.right,val);}
}方法三:利用二叉搜索树的特点优化迭代。
class Solution {public TreeNode searchBST(TreeNode root, int val) {while(root != null){if(val < root.val) root = root.left;else if(val > root.val) root = root.right;else return root;}return null;}
}