700. BST的搜索
class Solution {
// 递归
public TreeNode searchBST(TreeNode root, int val) {
if (root == null) return root;
if (val > root.val) return searchBST(root.right,val);
if (val < root.val) return searchBST(root.left,val);
// 递归结束的条件是 val == root.val,此时return root
return root;
}
}
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;
}
}
98.验证二叉搜索树
递归法:中序遍历,验证遍历的节点值是否为升序
class Solution {
public boolean isValidBST(TreeNode root) {
Deque<TreeNode> stack = new LinkedList<TreeNode>();
double inorder = -Double.MAX_VALUE;
if (root == null) return true;
while( !stack.isEmpty()|| root != null){
while( root != null){
stack.push(root);
root = root.left;
}
root = stack.pop();
if (root.val <= inorder){
return false;
}
inorder = root.val;
root = root.right;
}
return true;
}
}
235. 二叉搜索树的最近公共祖先: 力扣
二叉搜索树是有序的,节点cur左侧node比cur小,右侧node比cur大。分析可得:从上到下第一次遇到的数值在[p, q]区间中的节点cur就是 p和q的最近公共祖先。所以,只需根据cur的大小判断往哪支走,遇到的第一个落在区间里的就返回。
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left, p, q);
if (root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right, p,q);
return root;
}
530.二叉搜索树的最小绝对差: 力扣
因为BST是有序的,最小绝对差肯定出在中序遍历中相邻两个节点。用pre指针来记录上一个遍历的节点。
if (pre!=null){
result = Math.min(result,root.val-pre.val);
}
pre = root;
450.删除二叉搜索树中的节点
- 第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。