二叉搜索树
二叉搜索树中第K小的元素
class Solution {
int count=0;
int res=0;
public int kthSmallest(TreeNode root, int k) {
traver(root,k);
return res;
}
void traver(TreeNode root,int k){
if(root==null) return;
traver(root.left,k);
count++;
if(count==k) res=root.val;
traver(root.right,k);
}
}
二叉搜索树转换为累加树
class Solution {
public TreeNode convertBST(TreeNode root) {
traver(root);
return root;
}
int sum=0;
void traver(TreeNode root){
if(root==null) return;
traver(root.right);
sum+=root.val;
root.val=sum;
traver(root.left);
}
}
二叉搜索树 验证有效性 pre pre pre
注意要验证 左子树均小于根节点的值, 右子树均大于
所以要用一个pre来记录 root之前的值,进行中序遍历即可,用中序遍历 pre和root遍历完全部
class Solution {
TreeNode pre=null;
public boolean isValidBST(TreeNode root) {
if(root==null) return true;
boolean left=isValidBST(root.left);
if(pre!=null&&root.val<=pre.val) return false;
pre=root;
boolean right=isValidBST(root.right);
return left&&right;
}
}
二叉搜索树删除
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
if(root==null) return null;
if(root.val==key){//找到了目标值 三种情况
if(root.left==null) return root.right;
if(root.right==null) return root.left;//包含两种情况
TreeNode minNode=getMin(root.right);//找右子树中最小的结点
root.right=deleteNode(root.right,minNode.val);
minNode.left=root.left;
minNode.right=root.right;
root=minNode;
}
else if(root.val>key){
root.left=deleteNode(root.left,key);
}else if(root.val<key){
root.right=deleteNode(root.right,key);
}
return root;
}
TreeNode getMin(TreeNode root){
while(root.left!=null) root=root.left;//找最小
return root;
}
}