数据结构05-二叉排序树
一、二叉排序树的介绍
二叉排序树 或者是一颗空树,或者是一颗具有如下性质的树:
- 若左子树不为空,那么左子树上面的所有节点的关键字值都比根节点的关键字值小;
- 若右子树不为空,那么右子树上面的所有节点的关键字值都比根节点的关键字值大;
- 左右子树都为二叉树。
二叉排序树的查找效率比一般的二叉树高,但是增删效率低。
二、二叉排序树的实现
1.添加
public void put(E data) {
Node<E> now = new Node<E>(data);
if (root == null) {
root = now;
return;
}
Node<E> parent = root;
while (parent != null) {
//小于当前节点,就与左子树比较
if (data.compareTo(parent.data) < 0) {
//如果左子节点为空,那就放到左子节点
if (parent.left == null) {
parent.left = now;
now.parent = parent;
return;
//如果左子节点不为空,那就继续比较
} else {
parent = parent.left;
}
//大于当前节点,就放与右子树比较
} else if (data.compareTo(parent.data) > 0) {
//如果右子节点为空,那就放到右子节点
if (parent.right == null) {
parent.right = now;
now.parent = parent;
return;
//如果右子节点不为空,那就继续比较
} else {
parent = parent.right;
}
} else {
return;
}
}
}
2.查找
查找是二分查找的思想。
public Node<E> get(E data) {
if (root == null) {
return null;
}
Node<E> now = root;
while (now != null) {
//小于当前节点,就与左子树比较
if (data.compareTo(now.data) < 0) {
now = now.left;
//大于当前节点,就放与右子树比较
} else if (data.compareTo(now.data) > 0) {
now = now.right;
//等于当前节点,就直接返回当前节点
} else {
return now;
}
}
return null;
}
3.删除
删除元素:
1.若p有右子树,找到其右子树的最左子节点r,用r来替代p;
2.若p有左子树,没有右子树,找到其左子树的最右子节点l,用l来替代p;
3.若p是叶子节点,则直接删除
public Node<E> remove(E data) {
Node<E> p = get(data);
if (p == null) {
throw new NoSuchElementException();
}
//p的右子树的最左子节点r
Node<E> r = nodeLeft(p.right);
//p的左子树的最右子节点l
Node<E> l = nodeRight(p.left);
if (r != null) {
p.data = r.data;
//如果p的右子结点有左节点
if (r != p.right) {
r.parent.left = r.right;
} else {
p.right = p.right.right;
}
r.left = r.right = r.parent = null;
} else if (l != null) {
p.data = l.data;
//如果p的左子结点有右节点
if (l != p.left) {
l.parent.right = l.left;
} else {
p.left = p.left.left;
}
l.left = l.right = l.parent = null;
//如果p是叶子节点
} else {
if (p.parent == null) {
root = null;
} else if (p.parent.left == p) {
p.parent.left = null;
} else {
p.parent.right = null;
}
p.parent = null;
}
return p;
}
最后
数据结构与算法专题:https://www.jianshu.com/nb/25128590
喜欢请点赞,谢谢!