binary sort tree / binary search tree
性质:
1.若左子树不为空,则左子树上所有节点的值均小于它的根节点的值。
2.若右子树不为空,则右子树上所有节点的值均大于它的根节点的值。
3.左右子树也是二叉排序树。
4.没有值相同的节点。
查找步骤:
若根结点的值等于查找的关键字的值,成功。
否则,若小于根结点的关键字值,递归查找左子树。
若大于根结点的关键字值,递归查找右子树。
若子树为空,则查找不成功。
设 P(n,i)为它的左子树的结点个数为 i 时的平均查找长度。P(n):具有N个节点的平均查找长度。
则上图的 P(6, 3) = [ 1+ ( P(3) + 1) * 3 + ( P(2) + 1) * 2 ] / 6= [ 1+ ( 5/3 + 1) * 3 + ( 3/2 + 1) * 2 ] / 6
平均查找长度= 每个结点的深度的总和 / 总结点数
P(3) = (1+2+2)/ 3 = 5/3
P(2) = (1+2)/ 2 = 3/2
∴ P(n,i)= [ 1+ ( P(i) + 1) * i + ( P(n-i-1) + 1) * (n-i-1) ] / n
∴ P(n)= P(n,i)/ n <= 2(1+I/n)lnn = O(logn)
插入节点:
public BinaryNode insert(int value, BinaryNode node) {
if (node == null) {
return new BinaryNode(value, null, null);
}
int result = node.getNodeValue().compareTo(value);
if (result < 0) {
node.rightNode = insert(value, node.getRightNode());
} else if (result > 0) {
node.leftNode = insert(value, node.getLeftNode());
} else {
System.out.println("duplicate value , fail to insert");
}
return node;
}
删除节点:
// 查找value最小的节点
public BinaryNode findMin(BinaryNode node) {
if (node == null) {
return node;
} else if (node.getLeftNode() != null) {
// 从左节点开始查找
node = findMin(node.getLeftNode());
}
return node;
}
public BinaryNode delete(Integer value, BinaryNode node) {
if (node == null) {
return node;
}
// 将要删除的value值与二叉树的节点值比较
int result = value.compareTo(node.getNodeValue());
if (result < 0) {
// 从左子树查找符合删除条件的节点,设置新的左子树
node.setLeftNode(delete(value, node.getLeftNode()));
} else if (result > 0) {
// 从右子树查找符合条件的节点进行删除。设置新的右子树。
node.setRightNode(delete(value, node.getRightNode()));
} else if (node.getLeftNode() != null && node.getRightNode() != null) {
// 左右子树同时不为空,从右子树查找值最小的节点,将它的值与当前父节点的值交换
int minValue = findMin(node.getRightNode()).getNodeValue();
node.setNodeValue(minValue);
// 删除上述从右子树查找值最小的节点,设置新的右子树
node.setRightNode(delete(node.getNodeValue(), node.getRightNode()));
} else {
// 左右子树有一个为空,该节点的子节点替代该节点。
return node = (node.getLeftNode() != null) ? node.getLeftNode() : node.getRightNode();
}
return node;
}