js代码实现二叉查找树的算法
理论
二叉查找树(Binary Search Tree),又称二叉排序树或二叉搜索树,是属于二叉树的一种。它最大的特点是每个节点的左子节点永远比该节点小,而每个节点的右子节点却永远比该节点大,即任意节点的左子树上所有结点永远比该节点的右子树上所有结点的值小,它的任意左、右子树也分别为二叉查找树。
代码
以下是使用js代码来实现。
先定义二叉查找树的节点:
/**
* 树的节点
* @param data 节点的数值
* @param left 该节点的左子节点
* @param right 该节点的右子节点
*/
function TreeNode(data, left, right) {
this.data = data;
this.left = left || null;
this.right = right || null;
}
定义二叉树:
/**
* 二叉查找树
* @param rootNode 根节点
*/
function BinarySearchTree(rootNode) {
this.rootNode = rootNode || null;
}
BinarySearchTree.prototype = {
// 后面讲的查找,新增,删除功能会放在本区域(即原型)
}
二叉查找树的新增功能
插入工作必须按照二叉查找树的特性来完成。
- 首先判断该二叉树是否有根节点,如果没有则把新节点作为根节点,反之则继续;
- 从根节点开始逐级比较,即如果新结点的值小于根节点的值,则将新结点与根节点的左子树中的节点去比较,大于则与根节点的右子树中的节点去比较;
- 逐级比较直到找到需要插入的空位为止,把新节点放入即可;
新增代码如下:
/**
* 插入节点
* @param data 需要插入节点的值
*/
function insert(data) {
// 生成新的节点
var newNode = new TreeNode(data);
// 判断根节点是否存在
if (!this.rootNode) {
this.rootNode = newNode;
return;
}
var currentNode = this.rootNode;
var parent = null;
while (true) {
parent = currentNode;
if (data < currentNode.data) {
currentNode = currentNode.left;
if (!currentNode) {
parent.left = newNode;
return;
}
} else if (data > currentNode.data) {
currentNode = currentNode.right;
if (!currentNode) {
parent.right = newNode;
return;
}