二叉树

93 阅读1分钟

为何二叉树重要

题目

为何二叉树那么重要,而不是三叉树、四叉树呢?

分析

树是常见的数据结构,如 DOM 树,是一种多叉树。
其中二叉树是一个特别的存在,很重要,很常考。

【注意】本文涉及很多数据结构的知识,所以要“不求甚解” —— 掌握要点和结果,不求细节和过程

如何让性能整体最优?

有序结构

  • 数组:查找易,增删难
  • 链表:增删易,查找难

将两者优点结合起来 —— 二叉搜索树 BST :查找易,增删易 —— 可使用二分算法

二叉搜索树 BST

  • 左节点(包括其后代) <= 根节点
  • 右节点(包括其后代) >= 根节点

答案

  • 二叉树,可以充分利用二分法
  • 二叉树可以同时规避数字和链表的缺点
  • 引申到 BST BBST 等其他扩展结构
let arrTree = [];
/**
 * 二叉树前序遍历
 */
function preOrderTraverse(node) {
  if (node == null) return;
  arrTree.push(node.value);
  preOrderTraverse(node.left);
  preOrderTraverse(node.right);
}
/**
 * 二叉树中序遍历
 */
function inOrderTraverse(node) {
  if (node == null) return;
  inOrderTraverse(node.left);
  arrTree.push(node.value);
  inOrderTraverse(node.right);
}
/**
 * 二叉树后续遍历
 */
function postOrderTraverse(node) {
  if (node == null) return;
  postOrderTraverse(node.left);
  postOrderTraverse(node.right);
  arrTree(node.value);
}

求二叉搜索树的第 K 小的值

题目

一个二叉搜索树,求其中的第 K 小的节点的值。 如下图,第 3 小的节点是 4

/**
 * 寻找 BST 里的第 K 小值
 * @param node tree node
 * @param k 第几个值
 */

function getKthValue(node, k) {
  inOrderTraverse(node);
  console.log(arrTree);
  return arrTree[k - 1] || null;
}

// const bst = {
//   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));