想法是遍历二进制搜索树(BST)并使用相同的方法构建对象。该对象代表BST。
例如:
20
/ \
5 60
\ / \
10 40 90
\
50
\
55
我可以在将元素插入BST时生成此对象,但是,因为我想在其中应用一些平衡算法,所以我不需要插入任何其他节点。我只需要用平衡的结果得到最终的对象。
出现的横越方法是广度优先旅行。但是,我没有弄清楚如何以非递归方式构建对象,因为广度优先行程是一种迭代方法。
对于上面的示例,结果对象应如下所示:
{
val:20,
l:{
val:5,
l:{},
r:{
val:10,
l:{},
r:{}
}
},
r:{
val:60,
l:{
val:40,
l:{},
r:{
val:50,
l:{},
r:{
val:55,
l:{},
r:{}
}
}
},
r:{
val:90,
l:{},
r:{}
}
}
}
到目前为止我所拥有的是:
Breadth_first = function (callback) {
var q = [];
q.push(root);
while(q.length > 0){
var node = q.shift();
callback(node.level, node.value);
if(node.leftChild.value !== null){
q.push(node.leftChild);
}
if(node.rightChild.value !== null){
q.push(node.rightChild);
}
}
}
我用来构建这种格式的对象的当前方法如下:
insertNode = function (node, value, jsObj) {
if (node.value === null) {
node.leftChild = new Node();
node.rightChild = new Node();
node.value = value;
jsObj.val = value;
return true;
}
var nodeVal = parseInt(node.value, 10);
if (value < nodeVal) {
if(!jsObj.l.val)
jsObj.l = {val:null, l:{}, r:{}};
insertNode(node.leftChild, value, jsObj.l);
} else if (value > nodeVal) {
if(!jsObj.r.val)
jsObj.r = {val:null, l:{}, r:{}};
insertNode(node.rightChild, value, jsObj.r);
}
}
任何猜测或线索都会受到赞赏!