大家好,我是杨成功。
上一节我们使用遍历树的方式可以找到符合条件的任意值,不考虑性能的情况下,这种方式非常有效。
在树中寻值的另一个经典场景是寻找最大值和最小值,如果是二叉搜索树(BST),则可以使用性能更好的方式,因为最小值在最左边,而最大值在最右边。
定义一个查找二叉搜索树最小值的方法:
const getMinNode = (node) => {let current = node;while (current.left) {current = current.left;}return current;};// 使用const min_node = getMinNode(this.root);console.log(min_node.key); // 最小值
上述方法从根节点开始,层层遍历寻找左侧子节点,直到找到最后一个,该节点的值就是树中的最小值。
与查找最小值逻辑一致,区别是要层层遍历寻找右侧子节点,方法如下:
const getMaxNode = (node) => {let current = node;while (current.right) {current = current.right;}return current;};// 使用const max_node = getMaxNode(this.root);console.log(max_node.key); // 最大值
搜索最小值要找最左边的节点,搜索最大值要找最右边的节点;而搜索一个特定的值,需要每次遍历时判断应该要向左搜索还是向右搜索。
判断方式,就是用目标值与节点的值做比较,写一个比较函数如下:
const compareFN = (a, b) => {return a != b ? (a > b ? 1 : -1) : 0;};// 使用compareFN(1, 2); // -1compareFN(2, 2); // 0compareFN(3, 2); // 1
那么在搜索一个值时,传入目标值,并通过比较函数判断从哪个方向遍历树,方法如下:
const searchNode = (node, key) => {if (!node) {return null;}let comp = compareFN(key, node.key);if (comp == 0) {return node;}if (comp > 0) {return searchNode(node.right, key);} else {return searchNode(node.left, key);}};
如此,在二叉搜索树中遍历一个值的方法实现了。
在前端算法中,考察树的算法基本都是基于二叉搜索树(BST),本节我们学习了如何在 BST 中搜索最大最小值以及搜索一个特定的值,是树结构的基础用法。