1.题目描述:
给定二叉搜索树(BST)的根节点root和一个整数值val。你需要在BST中找到节点值等于val的节点。返回以该节点为根的子树。如果节点不存在,则返回null。
2.递归:
二叉搜索树/二叉查找树/二叉排序树:左子树所有节点的值都小于当前节点,右子树所有节点的值都大于当前节点,且左右子树都是二叉搜索树。此题可利用二叉搜索树的特点,查找节点并返回该节点即可。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
if (root == null) return null;
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 root;//只是为了有返回值而已无实际意义
}
}
优化一下:
class Solution {
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);
}
}
注普通二叉树的递归:
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
if (root == null || root.val == val) return root;
TreeNode temp = searchBST(root.left, val);
if (temp != null) return temp;
return searchBST(root.right, val);
}
}
3.迭代:
使用栈结构模拟递归,基于二叉搜索树的特性这种迭代会快很多:
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
if (root == null) return root;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode temp = stack.pop();
if (temp == null) continue;//可能存入null
if (temp.val == val) return temp;
if (temp.val > val) stack.push(temp.left);
else stack.push(temp.right);
}
return null;
}
}
4.基于二叉搜索树特性的简化迭代遍历:
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
while (root != null) {
if (root.val > val) root = root.left;
else if (root.val < val) root = root.right;
else return root;
}
return null;
}
}