二叉搜索树又称二叉排序树,它是具有以下性质的二叉树:
· 若它的的左子树不为空,则左子树上所有结点的值都小于根结点的值
·若它的的右子树不为空,则右子树上所有结点的值都大于根结点的值
·它的左右子树也分别称为二叉搜索树
插入
public boolean insert(int val){
Node node = new Node(val);
if(root == null){
root = node;
return true;
}
Node cur = root;
Node parent = null;
while(cur != null){
if(cur.val == val){
return false;
}else if(cur.val < val){
parent = cur;
cur = cur.left;
}else{
parent = cur;
cur = cur.right;
}
}
此时,设置不能有相同结点的值(即不能插入)
查找
最好情况: log2(n)
平均最坏情况(只有左或右子树): N/2
public boolean search(int val){
Node cur = root;
while(cur != null){
if(cur.val == val){
return true;
}else if(cur.val < val){
cur = cur. right;
}else{
cur = cur.left;
}
}
return false;
}
遍历
// 前序遍历
public void preOrder(Node root){
if(root == null) return;
System.out.println(root.val + " ");
preOrder(root.left);
preOrder(root.right);
}
public void inOrder(Node root){
if(root == null) return;
inOrder(root.left);
System.out.println(root.val + " ");
inOrder(root.right);
}
删除
public boolean remove(int key) {
Node cur = root;
Node parent = null;
while (cur != null) {
if(cur.val == key) {
removeNode(parent,cur);
return true;
}else if(key < cur.val) {
parent = cur;
cur = cur.left;
}else {
parent = cur;
cur = cur.right;
}
}
return false;
}
public void removeNode(Node parent,Node cur) {
if(cur.left == null) {
if(cur == root) {
root = cur.right;
}else if(cur == parent.left) {
parent.left = cur.right;
}else {
parent.right = cur.right;
}
}else if(cur.right == null) {
if(cur == root) {
root = cur.left;
}else if(cur == parent.left) {
parent.left = cur.left;
}else {
parent.right = cur.left;
}
}else {
Node targetParent = cur;
Node target = cur.right;
while (target.left != null) {
targetParent = target;
target = target.left;
}
cur.val = target.val;
if(target == targetParent.left) {
targetParent.left = target.right;
}else {
targetParent.right = target.right;
}
}
}