序列化BST树

时间:2014-04-04 19:40:34

标签: java serialization tree binary-search-tree

我正在尝试序列化BST,以便可以被其他程序读入。输出的节点后面跟着他们所有的孩子和他们的孩子等。如果没有额外的孩子,则关闭括号。

我的方法输出

(4 (2 (1 ) ) ( 3 ) ) (6  (5 )) (7 ))




public String serializePrefix(){
        StringBuilder str = new StringBuilder();
        serializePrefix (root, str, " ");
        return str.toString();
    }


    private void serializePrefix (Node t, StringBuilder str, String sep){
        int ID = 1;
        if (t == null)
            str.append(")");
        else{


                str.append("(" + t.data.toString() );
                str.append(sep);
                serializePrefix (t.left, str, sep);
                serializePrefix (t.right, str, sep);

        }

        ID++;

    }

我需要输出

(4 (2 (1 ) (3 ) ) (6 (5 ) (7 ) ) ))

这将创建树

         4
       /  \
      2    6
    /  \  / \
   1   3  5  7 

1 个答案:

答案 0 :(得分:1)

您遇到的第一个问题是当您找到 leaf 时:所有结束括号())都加倍,因为您尝试向左右链接前进,但是您发现null s,触发代码中的结束括号。

private void serializePrefix (Node t, StringBuilder str, String sep){
    int ID = 1;
    if (t == null)
        //ERROR: if empty node found, apply close bracket
        str.append(")");
    else{
        str.append("(" + t.data.toString() );
        str.append(sep);

        //this is the problem part, for example for node number 1:
        serializePrefix (t.left, str, sep); //this writes ")" first time
        serializePrefix (t.right, str, sep); //this writes ")" second time

    }

    ID++;

}

第二个问题是,在最后一个分支上,你的括号不会被正确关闭,因为当你的算法"退回"到根,它不会关闭打开的括号,因为它逐个退后......

修正提案:

private void serializePrefix (Node t, StringBuilder str, String sep){
    int ID = 1;
    if (t == null)
        // do nothing!
        // str.append(")");
    else{
        str.append("(" + t.data.toString() );
        str.append(sep);

        //this is the problem part, for example for node number 1:
        serializePrefix (t.left, str, sep); //this writes ")" first time
        serializePrefix (t.right, str, sep); //this writes ")" second time

        //close opened bracket
        str.append(")");
    }

    ID++;

}

(顺便说一句,一般建议尝试关闭你在打开它的可见距离内打开的内容......这有助于控制数据库连接等资源周围的泄漏。)< / p>