二叉搜索树
700.二叉搜索树中的搜索
给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。
例如,

在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。
public TreeNode searchBST(TreeNode root, int val) {
return search(root,val);
}
private TreeNode search(TreeNode root,int val){
if(root==null){
return null;
}
if(val>root.val){
return search(root.right,val);
}
if(val<root.val){
return search(root.left,val);
}
return root;
}
98. 验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。

public boolean isValidBST(TreeNode root) {
return process(root).isBST;
}
// max ,min left.isbst right.isbst left.max<root.val right.min>root.val
private Info process(TreeNode root){
if(root ==null){
return null;// 注意这里,设为空就好,因为最大值和最小值不好设置,会超限的情况,不好控制,后面用时判空就好
}
Info left=process(root.left);
Info right=process(root.right);
int min=root.val;
int max=root.val;
if(left!=null){
min=Math.min(left.min,min);
max=Math.max(left.max,max);
}
if(right!=null){
min=Math.min(right.min,min);
max=Math.max(right.max,max);
}
boolean isBST=false;
boolean leftFlag=left==null?true:left.isBST && left.max<root.val;
boolean rightFlag=right==null?true:right.isBST && right.min>root.val;
if(leftFlag && rightFlag){
isBST=true;
}
return new Info(max,min,isBST);
}
public class Info{
int max;
int min;
boolean isBST;
public Info(int max,int min,boolean isBST){
this.max=max;
this.min=min;
this.isBST=isBST;
}
}
530.二叉搜索树的最小绝对差
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
示例:

提示:树中至少有 2 个节点。
思路
题目中要求在二叉搜索树上任意两节点的差的绝对值的最小值。
注意是二叉搜索树,二叉搜索树可是有序的。
遇到在二叉搜索树上求什么最值啊,差值之类的,就把它想成在一个有序数组上求最值,求差值,这样就简单多了。
递归
那么二叉搜索树采用中序遍历,其实就是一个有序数组。
在一个有序数组上求两个数最小差值。
最直观的想法,就是把二叉搜索树转换成有序数组,然后遍历一遍数组,就统计出来最小差值了
遇到在二叉搜索树上求什么最值,求差值之类的,都要思考一下二叉搜索树可是有序的,要利用好这一特点。
class Solution {
int minDiff=Integer.MAX_VALUE;
TreeNode pre=null;
public int getMinimumDifference(TreeNode root) {
getMinDiff(root);
return minDiff;
}
private void getMinDiff(TreeNode root){
if(root==null){
return;
}
getMinDiff(root.left);
if(pre!=null){
minDiff=Math.min(minDiff,Math.abs(pre.val-root.val));
}
pre=root;
getMinDiff(root.right);
}
}
701. 二叉搜索树中的插入操作
给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。
注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。
示例 1:

public TreeNode insertIntoBST(TreeNode root, int val) {
return insert(root,val);
}
public TreeNode insert(TreeNode root,int val){
if(root==null){
return new TreeNode(val);
}
TreeNode cur=root;
TreeNode pre=null;
while(cur!=null){
pre=cur;
if(val>cur.val){
cur=cur.right;
}else {
cur=cur.left;
}
}
if(val>pre.val){
pre.right=new TreeNode(val);
}else{
pre.left=new TreeNode(val);
}
return root;
}
450. 删除二叉搜索树中的节点
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。
示例:
root = [5,3,6,2,4,null,7]
key = 3
5
/ \
3 6
/ \ \
2 4 7
public TreeNode deleteNode(TreeNode root, int key) {
return delete(root,key);
}
private TreeNode delete(TreeNode root,int key){
if(root==null){
return root;
}
TreeNode cur=root;
if(key>cur.val){
cur.right=delete(cur.right,key);//理解一下这里
}else if(key<cur.val){
cur.left=delete(cur.left,key);
}else{
if(cur.left==null && cur.right==null){
cur=null;
}else if(cur.left==null && cur.right!=null){
cur=cur.right;
}else if(cur.right==null && cur.left!=null){
cur=cur.left;
}else{
TreeNode des=cur.right;
TreeNode pre=null;
while(des.left!=null){
pre=des;
des=des.left;
}
if(pre!=null){
pre.left=des.right;
des.right=cur.right;
}
des.left=cur.left;
cur=des;
}
}
return cur;
}
108. 将有序数组转换为二叉搜索树
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
示例 1:

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:
public TreeNode sortedArrayToBST(int[] nums) {
if(nums==null || nums.length==0){
return null;
}
return sortTree(nums,0,nums.length-1);
}
private TreeNode sortTree(int[] nums,int L,int R){
if(L>R){
return null;
}
int M=L+((R-L)>>1);
TreeNode root=new TreeNode(nums[M]);
root.left=sortTree(nums,L,M-1);
root.right=sortTree(nums,M+1,R);
return root;
}


浙公网安备 33010602011771号