es6遍历树结构并判断_二叉搜索树的简明实现(ES5 & ES6)

二叉树 & 二叉搜索树

二叉树(Binary Tree)是 n(n >= 0)个节点的有限集合,集合为空集时,叫作空二叉树;不为空时,由根节点及左子树、右子树组成,左子树、右子树也都是二叉树。

从这个描述,可以看出树的结构与递归之间存在密切关系,这种密切关系在树的遍历时能够得到充分体现。

二叉搜索树(Binary Search Tree),又叫二叉查找树;也称为有序二叉树(Ordered Binary Tree),排序二叉树(Sorted Binary Tree)。

这是维基百科上归纳的一些二叉搜索树的性质:

若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;

若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;

任意节点的左、右子树也分别为二叉查找树;

没有键值相等的节点。

本次实现中有点不一样的地方,右节点是大于或等于父节点的。不过对示例没有影响,而且很容易改成只能大于父节点。

关于《学习JavaScript数据结构与算法(第2版)》

当年看过这本书的第一版,最近打算复习一下数据结构与算法,于是看了第二版。

这是难得的一本用 JavaScript 实现的数据结构与算法的书,它的讲解十分清晰,相对来说质量较高,但问题也有很多。应该说第一版的内容还是比较可靠的,第二版新增的内容可靠性就差了很多。总的来说,这是一本从非常浅显的层面讲解数据结构与算法的书,想获得比较全面的知识还是需要阅读更专业的资料。

本文的 ES5 实现参考了这本书,因为我觉得它是比较工整的实现,用于学习和理解时,好过我看到的其他一些实现方式。在原书示例代码的基础上,我做了一些小调整。本书第二版号称拥抱 ES6,但我看过之后发现至少树这一章没有改为 ES6 的实现,于是自己写了一遍,正好当作练习的机会。

另外,这本书中提到的树的遍历方式包括中序、先序、后序遍历,这些都属于深度优先遍历。在本文的代码中,我补充了广度优先遍历以及按照层次遍历二叉树的实现。

Binary Search Tree - ES5

var BinarySearchTree = function() {

var Node = function(key) {

this.key = key;

this.left = null;

this.right = null;

};

var root = null;

var insertNode = function(node, newNode) {

if (newNode.key < node.key) {

if (node.left === null) {

node.left = newNode;

} else {

insertNode(node.left, newNode);

}

} else {

if (node.right === null) {

node.right = newNode;

} else {

insertNode(node.right, newNode);

}

}

};

var inOrderTraverseNode = function(node, cb) {

if (node !== null) {

inOrderTraverseNode(node.left, cb);

cb(node.key);

inOrderTraverseNode(node.right, cb);

}

};

var preOrderTraverseNode = function(node, cb) {

if (node !== null) {

cb(node.key);

preOrderTraverseNode(node.left, cb);

preOrderTraverseNode(node.right, cb);

}

};

var postOrderTraverseNode = function(node, cb) {

if (node !== null) {

postOrderTraverseNode(node.left, cb);

postOrderTraverseNode

}

};

var levelOrderTraverseNode = function(node, cb) {

if (node === null) {

return null;

}

var list = [node];

while (list.length > 0) {

node = list.shift();

cb(node.key);

if (node.left) {

list.push(node.left);

}

if (node.right) {

list.push(node.right);

}

}

};

var separateByLevelFn = function(node, cb, separator) {

var list = [];

var END_FLAG = 'END_FLAG';

list.push(node);

list.push(END_FLAG);

separator = separator || '---*---';

while (list.length

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值