在JavaScript中遍历二进制搜索树时构建对象

时间:2017-04-24 04:31:25

标签: javascript binary-search-tree javascript-objects tree-traversal

想法是遍历二进制搜索树(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);
    }
}

任何猜测或线索都会受到赞赏!

0 个答案:

没有答案