1. BST非递归插入
- 首先通过
不断比较
,找到cur == null 情况下的cur的父节点(parent) - 再经过和其父亲节点的data比较然后再将其插入到孩子域中
public void non_insert(T data) {
if (this.root == null) {
root = new BSTNode<>(data, null, null);
}
BSTNode<T> parent = null;
BSTNode<T> cur = root;
while (cur != null) {
parent = cur;
if (cur.getData().compareTo(data) > 0) {
cur = cur.getLeft();
} else if (cur.getData().compareTo(data) < 0) {
cur = cur.getRight();
} else {
return;
}
}
if (parent.getData().compareTo(data) > 0) {
parent.setLeft(new BSTNode<>(data, null, null));
} else if (parent.getData().compareTo(data) < 0) {
parent.setRight(new BSTNode<>(data, null, null));
}
}
2.BST递归插入
public void insert(T data) {
this.root = insert(this.root, data);
}
private BSTNode<T> insert(BSTNode<T> root, T data) {
if (root == null) {
return new BSTNode<>(data, null, null);
}
if (root.getData().compareTo(data) < 0) {
root.setRight(insert(root.getRight(), data));
} else if (root.getData().compareTo(data) > 0) {
root.setLeft(insert(root.getLeft(), data));
}
return root;
}
3.BST 的非递归删除
blic void non_remove(T data) {
if (root == null) {
return;
}
BSTNode<T> parent = null;
BSTNode<T> cur = root;
while (cur != null) {
if (cur.getData().compareTo(data) > 0) {
parent = cur;
cur = cur.getLeft();
} else if (cur.getData().compareTo(data) < 0) {
parent = cur;
cur = cur.getRight();
} else {
break;
}
}
if (cur == null) {
return;
}
if (cur.getLeft() != null && cur.getRight() != null) {
BSTNode<T> old = cur;
parent = cur;
cur = cur.getLeft();
while (cur.getRight() != null) {
parent = cur;
cur = cur.getRight();
}
old.setData(cur.getData());
}
BSTNode<T> child = cur.getLeft();
if (child == null) {
child = cur.getRight();
}
if (parent == null) {
this.root = child;
} else {
if (cur == parent.getLeft()) {
parent.setLeft(child);
} else {
parent.setRight(child);
}
}
}
4.BST的递归删除
public void remove(T data) {
this.root = remove(root, data);
}
private BSTNode<T> remove(BSTNode<T> root, T data) {
if (root == null) {
return null;
}
if (root.getData().compareTo(data) > 0) {
root.setLeft(remove(root.getLeft(), data));
} else if (root.getData().compareTo(data) < 0) {
root.setRight(remove(root.getRight(), data));
} else {
if (root.getRight() != null && root.getLeft() != null) {
BSTNode<T> pre = root.getLeft();
while (pre.getRight() != null) {
pre = pre.getRight();
}
root.setData(pre.getData());
root.setLeft(remove(root.getLeft(), data));
} else {
if (root.getLeft() != null) {
return root.getLeft();
} else if (root.getRight() != null) {
return root.getRight();
} else {
return null;
}
}
}
return root;
}
5.非递归查询操作
public boolean non_quary(T data) {
BSTNode<T> cur = root;
while (cur != null) {
if (cur.getData().compareTo(data) > 0) {
cur = cur.getLeft();
} else if (cur.getData().compareTo(data) < 0) {
cur = cur.getRight();
} else {
return true;
}
}
return false;
}
6.BST递归查询操作
public boolean quary(T data) {
return quary(root, data);
}
private boolean quary(BSTNode<T> root, T data) {
if (root == null) {
return false;
}
if (root.getData().compareTo(data) > 0) {
return quary(root.getLeft(), data);
} else if (root.getData().compareTo(data) < 0) {
return quary(root.getLeft(), data);
} else {
return true;
}
}
7.求BST树的镜像
- (也就是遍历问题,将整棵树遍历一遍) 此处遍历只能是先序遍历 或者 后序遍历
- 简单来说就是将左右子树交换
- 此时中序遍历结果为递减的
public void mirror() {
mirror(root);
}
private void mirror(BSTNode<T> root) {
if (root == null) {
return;
}
BSTNode<T> temp = root.getLeft();
root.setLeft(root.getRight());
root.setRight(temp);
mirror(root.getLeft());
mirror(root.getRight());
}
8.将BST树中满足[begin,end]区间的数打印出来
public void findAreaDatas(T begin, T end) {
findAreaDatas(root, begin, end);
}
private void findAreaDatas(BSTNode<T> root, T begin, T end) {
if (root == null) {
return;
}
if (root.getData().compareTo(begin) > 0) {
findAreaDatas(root.getLeft(), begin, end);
}
if (root.getData().compareTo(begin) >= 0 && root.getData().compareTo(end) <= 0) {
System.out.print(root.getData() + " ");
}
if (root.getData().compareTo(end) < 0) {
findAreaDatas(root.getRight(), begin, end);
}
}
9.判断一个二叉树是否为BST树,是BST树返回true 不是返回false
BSTNode<T> pre = null;
public boolean isBSTree() {
return isBSTree(this.root);
}
private boolean isBSTree(BSTNode<T> root) {
if (root == null) {
return true;
}
if (!isBSTree(root.getLeft())) {
return false;
}
if (pre != null && root.getData().compareTo(pre.getData()) < 0) {
return false;
}
return isBSTree(root.getLeft());
}