将数据放入二叉搜索树后,您可以像下面这样递归它。使用递归来跟踪树中每个节点的深度。
在每次递归调用中,将当前级别的节点推送到哈希表,使用级别作为键,节点作为值。
在 JavaScript 中,您可以使用数组或对象字面量来执行此操作。我将所有内容存储在一个 JavaScript 对象文字中,它类似于引擎盖下的哈希表。像这样:
level = 0
object[level] = [node1] => { '0': [node, node2] }
object[level] = [node2] => { '0': [node1, node2] }
level = 1
object[level] = [node3] => { '0': [node, node2], '1': [node3] }
ETC...
在推送之前,请检查密钥是否存在。如果它不存在,只需将节点插入到包含在数组中的散列中。
如果存在键(意味着存在级别冲突),则只需通过在该键处推送到数组来调用冲突解决方案。
现在,您将每个级别的所有节点都存储在对象内的唯一数组中。它应该如下所示:
{ '0': [ 20 ],
'1': [ 8, 22 ],
'2': [ 4, 12, 24 ],
'3': [ 10, 14 ] } */
或者,如果您要存储整个节点:
{ '0': [ { value: 20, right: [Object], left: [Object] } ],
'1':
[ { value: 8, right: [Object], left: [Object] },
{ value: 22, right: [Object], left: null } ],
'2':
[ { value: 4, right: null, left: null },
{ value: 12, right: [Object], left: [Object] },
{ value: 24, right: null, left: null } ],
'3':
[ { value: 10, right: null, left: null },
{ value: 14, right: null, left: null } ] }
在此之后,您可以对他们做任何您想做的事。对每个级别的值求和,转换为链表,或者在您的情况下,只需检查所需级别的数组长度。这将为您提供节点数。
BinaryTree.prototype.kNodesAtDepth = function(level) {
var levels = {};
var traverse = function(current, depth) {
if (!current) return null;
if (!levels[depth]) levels[depth] = [current.value];
else levels[depth].push(current.value);
traverse(current.left, depth + 1);
traverse(current.right, depth + 1);
};
traverse(this.root, 0);
return levels[level].length;
};
//tests
var bst = new BinaryTree();
bst.add(20, 22, 8, 4, 12, 10, 14, 24);
var nodeCount = bst.kNodesAtDepth(2); //3
console.log(nodeCount); //3