java数据结构之二叉排序树

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;
}

猜你喜欢

转载自blog.csdn.net/qq_34561892/article/details/82714197