算法:求一个二叉搜索树的第k小值

33 阅读1分钟

二叉树

  • 是一棵树
  • 每个节点,最多只能由2个子节点
  • 树节点的数据结构 { value, left?, right?}

二叉树的遍历

  • 前序遍历: root -> left -> right
  • 中序遍历: left -> root -> right
  • 后序遍历: left -> right -> root

image.png

以下图二叉树为例:

image.png

基础二叉树及其遍历代码

interface ITreeNode {
  value: number
  left: ITreeNode | null
  right: ITreeNode | null
}

function preOrderTraverse(node: ITreeNode | null) {
  if (node == null) return
  console.log(node.value)
  preOrderTraverse(node.left)
  preOrderTraverse(node.right)
}

function inOrderTraverse(node: ITreeNode | null) {
  if (node == null) return
  inOrderTraverse(node.left)
  console.log(node.value)
  inOrderTraverse(node.right)
}

function postOrderTraverse(node: ITreeNode | null) {
  if (node == null) return
  postOrderTraverse(node.left)
  postOrderTraverse(node.right)
  console.log(node.value)
}

const treeNode: ITreeNode = {
  value: 5,
  left: {
    value: 3,
    left: {
      value: 2,
      left: null,
      right: null,
    },
    right: {
      value: 4,
      left: null,
      right: null,
    },
  },
  right: {
    value: 7,
    left: {
      value: 6,
      left: null,
      right: null,
    },
    right: {
      value: 8,
      left: null,
      right: null,
    },
  },
}
console.log('pre')
preOrderTraverse(treeNode)
console.log('in')
inOrderTraverse(treeNode)
console.log('post')
postOrderTraverse(treeNode)

结果:

image.png

二叉搜索树

  • left(包括其后代) value <= root value
  • right(包括其后代) value >= root value

image.png

解题思路

  • BST中序遍历,即从小到大的排序
  • 找到排序后的第k值即可

代码

interface ITreeNode {
  value: number
  left: ITreeNode | null
  right: ITreeNode | null
}

const arr: number[] = []

function inOrderTraverse(node: ITreeNode | null) {
  if (node == null) return
  inOrderTraverse(node.left)
  arr.push(node.value)
  inOrderTraverse(node.right)
}

function getKthValue(node: ITreeNode, k: number): number | null {
  inOrderTraverse(node)
  return arr[k - 1] || null
}

const bst: ITreeNode = {
  value: 5,
  left: {
    value: 3,
    left: {
      value: 2,
      left: null,
      right: null,
    },
    right: {
      value: 4,
      left: null,
      right: null,
    },
  },
  right: {
    value: 7,
    left: {
      value: 6,
      left: null,
      right: null,
    },
    right: {
      value: 8,
      left: null,
      right: null,
    },
  },
}

console.log(getKthValue(bst,3)) // 4

划重点

  • 二叉搜索树的价值:可以使用二分法进行快速查找