节点定义:
public class Node{
public int value;
public Node left;
public Node right;
}
二叉排序树的增:
public void add(int m) {
Node x = new Node();
x.value = m;
if(tree == null) {
tree = x;
}else {
Node flag = tree;
for(;;) {
if(m <= flag.value) {
if(flag.left == null) {
flag.left = x;
break;
}else {
flag = flag.left;
}
}else {
if(flag.right == null) {
flag.right = x;
break;
}else {
flag = flag.right;
}
}
}
}
}
二叉排序树的查:
public String select(int index) {
Node flag = tree;
for(;;) {
if(flag == null) {
return "木有找到";
}else if(flag.value == index) {
return "value = "+ index +"";
}else if(flag.value < index) {
flag = flag.right;
}else {
flag = flag.left;
}
}
}
二叉排序树的删:
public void delete(int index) {
Node delparent = tree;
Node delflag = tree;
int isleft = 1;
//寻找删除节点及其父节点
for(;;) {
//找到待删除结点及其父节点
if(delflag.value == index) {
Node parent = delflag;
Node flag;
//删除结点右侧不为空,进入右分支,寻找右分支最左侧结点
if(delflag.right != null) {
flag = delflag.right;
for(;;) {
if(flag.left != null) {
parent = flag;
flag = flag.left;
}else {
break;
}
}
//找到替换节点,改变指向,也可以修改节点的值,都行
Node temp = flag.right;
if(delflag.left !=flag) flag.left = delflag.left;
if(delflag.right !=flag) flag.right = delflag.right;
if(delflag != parent) parent.left = temp;
}else if(delflag.left != null){//左分支与右分支大致相同
flag = delflag.left;
for(;;) {
if(flag.right != null) {
parent = flag;
flag = flag.right;
}else {
break;
}
}
Node temp = flag.left;
if(delflag.left !=flag) flag.left = delflag.left;
if(delflag.right !=flag) flag.right = delflag.right;
if(delflag != parent) parent.right = temp;
}else {//删除节点两侧都为空时,直接删除此结点
if(isleft == 1) {
delparent.left = null;
}else {
delparent.right = null;
}
break;
}
//根据不同情况改变指向,分别为删除跟结点时,删除的是某个左节点时,删除的某个右节点时
if(index == tree.value) {
tree = flag;
}else if(isleft == 1) {
delparent.left = flag;
}else if(isleft == 0) {
delparent.right = flag;
}
break;//终止循环
}else if(delflag.value > index) {
delparent = delflag;
delflag = delflag.left;
isleft = 1;
}else {
delparent = delflag;
delflag = delflag.right;
isleft = 0;
}
}
}
二叉排序树的改:
先判断是否存在此节点,存在的话删除,再进行插入