二叉树

13 阅读1分钟

遍历

前序遍历


function preOrderTraverse(node) {
  if(!node) return
  console.log(node.value)
  preOrderTraverse(node.left)
  preOrderTraverse(node.right)
}

preOrderTraverse(r)  // root, left, right: 前序遍历root在前面

中序遍历

function inOrderTraverse(node) {
  if(!node) return
  inOrderTraverse(node.left)
  console.log(node.value)
  inOrderTraverse(node.right)
}

inOrderTraverse(r)   // left, root, right: 中序遍历root在中间

后序遍历

function postOrderTraverse(node) {
  if(!node) return
  postOrderTraverse(node.left)
  postOrderTraverse(node.right)
  console.log(node.value)
}

postOrderTraverse(r) // left, right, root: 后序遍历root在后边

二叉搜索树

结构特点

  • left <= node
  • right >= node

求第k小值

image.png

  • 二叉搜索树的结构特点: letf < node < right
  • 使用中序遍历,
  • 顺序刚好为 nums = [2, 3, 4, 5, 6, 7, 8]
  • 刚好是一个递增数组
  • 第k小值为 nums[k-1]
  • leetCode
type TreeNode = {
  val: number;
  left: TreeNode | null;
  right: TreeNode | null;
};

function getNums(root: TreeNode | null) {
  const nums: number[] = [];

  inOrderTraverse(root);

  return nums;

  function inOrderTraverse(node: TreeNode | null) {
    if (!node) return;
    inOrderTraverse(node.left);
    nums.push(node.val);
    inOrderTraverse(node.right);
  }
}

function kthSmallest(root: TreeNode | null, k: number): number {
  const nums = getNums(root);

  return nums[k - 1];
}

最小堆

image.png

结构特点:

父节点永远小于子节点

结构关系

// 为了节约内存空间, 我们一般用数组来存放二叉树
const nums = [-1, 10, 14, 25, 33, 81, 82, 99]

// 如何查询: 
// 例如: 14 的index是 2, parent是10, left是33, right是81
const parentIndex = Math.floor(i/2)
const leftIndex = 2*i
const rightIndex = 2*i+1