二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:
● 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
● 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
● 它的左右子树也分别为二叉搜索树
/**
* @Author 12629
* @Description:
*/
public class BinarySearchTree {
static class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}
public TreeNode root = null;
/**
* 查找二叉搜索树中指定的val值
* @param val
* @return
*/
public TreeNode find(int val) {
TreeNode cur = root;
while (cur != null) {
if(cur.val < val) {
cur = cur.right;
}else if(cur.val == val) {
return cur;
}else {
cur = cur.left;
}
}
return null;
}
/**
* 插入一个数据
* @param val
*/
public void insert(int val) {
if(root == null) {
root = new TreeNode(val);
return;
}
TreeNode cur = root;
TreeNode parent = null;
while (cur != null) {
if(cur.val < val) {
parent = cur;
cur = cur.right;
}else if(cur.val == val){
return;
}else {
parent = cur;
cur = cur.left;
}
}
TreeNode node = new TreeNode(val);
if(parent.val < val) {
parent.right = node;
}else {
parent.left = node;
}
}
public void inorder(TreeNode root) {
if(root == null) {
return;
}
inorder(root.left);
System.out.print(root.val+" ");
inorder(root.right);
}
/**
* 删除值为val的节点
* @param val
*/
public void remove(int val) {
TreeNode cur = root;
TreeNode parent = null;
while (cur != null) {
if(cur.val == val) {
removeNode(parent,cur);
return;
}else if(cur.val < val) {
parent = cur;
cur = cur.right;
}else {
parent = cur;
cur = cur.left;
}
}
}//alt+回车
private void removeNode(TreeNode parent, TreeNode cur) {
if(cur.left == null) {
if(cur == root) {
root = cur.right;
}else if(parent.left == cur) {
parent.left = cur.right;
}else {
parent.right = cur.right;
}
}else if(cur.right == null) {
if(cur == root) {
root = cur.left;
}else if(parent.left == cur) {
parent.left = cur.left;
}else {
parent.right = cur.left;
}
}else {
TreeNode target = cur.right;
TreeNode targetParent = cur;
while (target.left != null) {
targetParent = target;
target = target.left;
}//但是可能targer的左边为空
cur.val = target.val;
if(target == targetParent.left) {
targetParent.left = target.right;
}else {
// 当target的左边为空时,
targetParent.right = target.right;
}
}
}
}