为何二叉树重要
题目
为何二叉树那么重要,而不是三叉树、四叉树呢?
分析
树是常见的数据结构,如 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));