需求:
给定二叉搜索树(BST)的根节点 root 和一个整数值 val。
你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。
示例 1:
概念:
什么是二叉搜索树?
任意根节点比左子树的值要大,比右子树的值要小。并且子节点也遵循这个规则。
思路
递归法:
根据二叉搜索树的概念来看,递归是不需要考虑左右后序遍历的,根绝当前值得大小来决定递归调用
层序遍历
层序遍历根据当前值的大小决定是否将子节点放入下次循环,减少了放入的元素两循环也就减少了。
/**
* 700. 二叉搜索树中的搜索
*/
public class SearchBST700 {
/**
* 地递归遍历
* 由于二叉搜索树是有顺序的,
* 所以不需要考虑前中后序
*/
public TreeNode searchBST(TreeNode root, int val) {
if (root == null || root.val == val) return root;
if (root.val > val) {
// >小于情况,一定是往右走,只会出现一条路
// 不会出现左右分支都有结果的情况
return searchBST(root.left, val);
} else {
return searchBST(root.right, val);
}
}
/**
* 层序遍历(广度遍历)栈实现
*/
public TreeNode searchBSTGd(TreeNode root, int val) {
if (root == null || root.val == val) return root;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
if (node.val == val) return node;
if (node.val > val) {
if (node.left != null) {
stack.push(node.left);
}
} else {
if (node.right != null) {
stack.push(node.right);
}
}
}
return null;
}
/**
* 层序遍历(广度遍历)简洁
*/
public TreeNode searchBSTJj(TreeNode root, int val) {
if (root == null || root.val == val) return root;
while (root !=null) {
if(val< root.val){
root = root.left;
}else if(val> root.val){
return root.right;
}else {
return root;
}
}
return null;
}
}