我正在尝试序列化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
答案 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>