TypeScript 实现二叉查找树

257 阅读1分钟

API

// 花费:查找、插入:平均 1.39logN,最坏 N

class TreeNode<Key, Value> {
  public key: Key
  public value: Value
  public N: number // 以该节点为根的树的节点总数

  public left: TreeNode<Key, Value>
  public right: TreeNode<Key, Value>
  constructor(key: Key, value: Value, N: number) {
    this.key = key
    this.value = value
    this.N = N
    this.left = null
    this.right = null
  }
}

class BST<Key, Value> {
  private root: TreeNode<Key, Value>
  
  constructor() {
    this.root = null
  }

  size(): number {}
  private __size(node: TreeNode<Key, Value>): number {}

  get(key: Key): Value {}
  private __get(node: TreeNode<Key, Value>, key: Key): Value {}

  put(key: Key, val: Value): void {}
  private __put(node: TreeNode<Key, Value>, key: Key, value: Value): TreeNode<Key, Value> {}

  min(): Key {}
  private __min(node: TreeNode<Key, Value>): TreeNode<Key, Value> {}

  select(k: number): Key {}
  private __select(node: TreeNode<Key, Value>, k: number): TreeNode<Key, Value> {}

  deleteMin(): void {}
  private __deleteMax(node: TreeNode<Key, Value>): TreeNode<Key, Value> {}

  delete(): void {}
  private __delete(node: TreeNode<Key, Value>, key: Key): TreeNode<Key, Value> {}

  isEmpty(): boolean {}
}

实现

// 花费:查找、插入:平均 1.39logN,最坏 N

class TreeNode<Key, Value> {
  public key: Key
  public value: Value
  public N: number // 以该节点为根的树的节点总数

  public left: TreeNode<Key, Value>
  public right: TreeNode<Key, Value>
  constructor(key: Key, value: Value, N: number) {
    this.key = key
    this.value = value
    this.N = N
    this.left = null
    this.right = null
  }
}

class BST<Key, Value> {
  private root: TreeNode<Key, Value>

  constructor() {
    this.root = null
  }

  size(): number {
    return this.__size(this.root)
  }
  private __size(node: TreeNode<Key, Value>): number {
    if (node === null) return 0
    return node.N
  }

  get(key: Key): Value {
    return this.__get(this.root, key)
  }
  private __get(node: TreeNode<Key, Value>, key: Key): Value {
    // 只可能返回 null 或 node.value
    if (node === null) return null
    if (key === node.key) return node.value
    if (key > node.key) return this.__get(node.right, key)
    if (key < node.key) return this.__get(node.left, key)
  }

  put(key: Key, val: Value): void {
    // 当 root 为 null 时,需要赋值
    this.root = this.__put(this.root, key, val)
  }
  private __put(node: TreeNode<Key, Value>, key: Key, value: Value): TreeNode<Key, Value> {
    if (node === null) return new TreeNode<Key, Value>(key, value, 1)
    if (key === node.key) node.value = value
    if (key > node.key) node.right = this.__put(node.right, key, value) // 如果子树为null,需要赋值
    if (key < node.key) node.left = this.__put(node.left, key, value)
    // 从下往上更新计数器(当查找到 key 时,是无用操作)
    node.N = this.__size(node.left) + this.__size(node.right) + 1
    // 所以这里也需要返回 node
    return node
  }

  min(): Key {
    return this.__min(this.root).key
  }
  private __min(node: TreeNode<Key, Value>): TreeNode<Key, Value> {}

  select(k: number): Key {
    return this.__select(this.root, k).key
  }
  private __select(node: TreeNode<Key, Value>, k: number): TreeNode<Key, Value> {}

  deleteMin(): void {}
  private __deleteMax(node: TreeNode<Key, Value>): TreeNode<Key, Value> {}

  delete(): void {}
  private __delete(node: TreeNode<Key, Value>, key: Key): TreeNode<Key, Value> {}

  isEmpty(): boolean {}
}

const a = [5, 3, 6, 1, 543, 24, 56, 123, 444, 325]
const bst = new BST<number, number>()
a.forEach((item, index) => bst.put(index, item))
console.log(bst.get(0), bst.get(3), bst.get(5), bst.get(1)) // 5 1 24 3