Skip to content

求二叉搜索树的第K小值

实现目标,在二叉搜索树找到第K小值

js
/**
 *     5
 *    / \
 *   3   7
 *  / \  /\
 * 2  4 6  8
 */

实现思路,BST(二叉搜索树中序遍历,既从小到大排序)

代码实现

ts
/**
 * @desc 二分树搜索
 * @author lzw.
 */

// 二叉树节点
interface ITreeNode {
  value: number,
  left: ITreeNode | null,
  right: ITreeNode | null
}

const arr: number[] = []

/**
 *     5
 *    / \
 *   3   7
 *  / \  /\
 * 2  4 6  8 
 */

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

// 前序遍历
function proOrderTraverse(node: ITreeNode | null) {
  if (node == null) return
  // console.log(node.value)
  arr.push(node.value)
  proOrderTraverse(node.left)
  proOrderTraverse(node.right)
}
// 测试
// proOrderTraverse(bst)

// 中序遍历
function inOrderTraverse(node: ITreeNode | null) {
  if (node == null) return
  inOrderTraverse(node.left)
  // console.log(node.value)
  arr.push(node.value)
  inOrderTraverse(node.right)
}
// 测试
// inOrderTraverse(bst)

// 后序遍历
function postOrderTraverse(node: ITreeNode | null) {
  if (node == null) return
  postOrderTraverse(node.right)
  postOrderTraverse(node.left)
  // console.log(node.value)
  arr.push(node.value)
}
// 测试
// postOrderTraverse(bst)


// =====求二叉搜索树的第K小值
function getKthVal(node: ITreeNode, k: number): number | null {
  inOrderTraverse(node)
  return arr[k - 1] || null
}
console.log(getKthVal(bst, 3)) // 测试