左节点均比根节点值小,右节点均比根节点值大。
一.构造(插入)二叉树
构造二叉搜索树先输入一组数据,循环插入这一组数据
BinarySearchTree binarySearchTree = new BinarySearchTree();
for(int i = 0 ; i < array.length ; i++){
binarySearchTree.insert(array[i]);
}
首先创建新的节点,判断该搜索二叉树是否为空,为空时将该节点赋值给root节点。
public void insert(int key){
Node node = new Node(key);
if(root == null){
root = node;
return;
}
判断过后创建父亲节点parent以及当前节点cur,寻找适合插入的空节点位置,并记录该位置的父亲节点,判断插入值与父亲节点值的大小来进行插入。
Node cur = root;
Node parent = null;
while(cur != null){
if(cur.val < key){
parent = cur;
cur = cur.right;
}else if(cur.val > key){
parent = cur;
cur = cur.left;
}else{
System.out.println("不可插入");
return;
}
}
if(parent.val < key){
parent.right = node;
}
if(parent.val > key){
parent.left = node;
}
} }
二.查找数据
public boolean Search(int key){
if(root == null){
return false;
}
Node cur = root;
while(cur != null){
if(cur.val == key){
return true;
}else if(cur.val < key){
cur = cur.right;
}else{
cur = cur.left;
}
}
return false;
}
三.删除数据
首先,找出删除数据的父亲节点以及当前节点
public void remove(int key){
if(root == null){
return;
}
Node cur = root;
Node parent = null;
while(cur!= null){
if(cur.val < key){
parent = cur;
cur = cur.right;
}else if(cur.val > key){
parent = cur;
cur = cur.left;
}else{
removeNode(parent , cur);
return;
}
}
执行删除步骤需要考虑多种情况:
(1).删除数据的左节点为空
public void removeNode(Node parent , Node cur){
if(cur.left == null){
if(root == cur){
root = cur.right;
}else if(cur == parent.left){
parent.left = cur.right;
}else{
parent.right = cur.right;
}
(2).删除数据的右节点为空
else if(cur.right == null){
if(root == cur){
root = cur.left;
}else if(cur == parent.left){
parent.left = cur.left;
}else {
parent.right = cur.left;
}
(3).删除数据的左右节点均为空
选取删除节点左子树的最大值,或选取删除节点右子树的最小值,替换删除节点,再将此最值进行删除。
例如删除节点值为7,寻找该节点右子树的最小值
最小值替换删除节点
再将t节点删除
该代码选取右子树的最小值
else{
Node tp = cur;
Node t = tp.right;
while(t.left != null){
tp = t;
t = t.left;
}
cur.val = t.val;
if(tp.left == t){
tp.left = t.right;
}else{
tp.right = t.right;
}
}