我有一个轻微的算法问题。我想我错过了一些东西,但不能完全弄清楚是什么。
我想走到一棵包含字符串的树上,然后拿出一个唯一的字符串。
这是我要解析的树的图形示例。
我的树将具有三种不同类型的元素:
- 布尔运算符(OR、NOT、AND)=> BE
- 其他运算符(如 =)=> QO
- 叶子(最后一个元素)=> LEAF
我想结束这样的事情:
"LEAF QO LEAF BE LEAF QO LEAF "
现在,我使用递归方法:我检查树的当前元素,并根据我拥有的元素类型在其子元素上重新运行该方法。对于每一步,我都会填充我的最终字符串。
公共类 SingleTest { static String[] booleanElements = {"or", "and", "not"};
public static void main(String[] args) throws Exception {
CommonTree tree = (CommonTree)parser.parse().getTree();
if(true){
String where = "";
printWhere(tree, where);
System.out.println(where);
}
}
/*
* Print to where tests
*/
public static boolean isBooleanElement(CommonTree t){
return Arrays.asList(booleanElements).contains(t.toString().toLowerCase());
}
public static String printWhere(CommonTree t, String where){
//---------------------
// Checking node type
//---------------------
// Boolean Element
if (isBooleanElement(t)){
// Continue parsing the tree
for ( int i = 0; i < t.getChildCount(); i++ ) {
printWhere((CommonTree)t.getChild(i), where+ "BE");
}
}
// Last element of tree (LEAF)
else if(t.getChildCount() == 0 ){
where = where + "LEAF";
}
// query operator
else{
// Continue parsing the tree
for ( int i = 0; i < t.getChildCount(); i++ ) {
printWhere((CommonTree)t.getChild(i), where + "QO");
}
}
//---------------------
return where;
}
我的问题是这段代码:
String where = "";
System.out.println(printWhere(tree, where));
返回“”(由于我的实现,这是合乎逻辑的)。
所以我的问题是,我怎样才能将非 void 字符串作为最终输出?
希望这足够清楚谢谢您的帮助
请注意,此类仅用于测试目的,我知道将 static 放在任何地方都是不好的做法 :)
编辑 :
问题是(如预期的那样)由于我缺乏递归经验。这是我的最终代码:
public static String printWhere(CommonTree t, String where){
//---------------------
// Checking node type
//---------------------
// Boolean Element
if (isBooleanElement(t)){
// Continue parsing the tree
for ( int i = 0; i < t.getChildCount(); i++ ) {
where = printWhere((CommonTree)t.getChild(i), where) + "BE";
}
}
// Last element of tree (LEAF)
else if(t.getChildCount() == 0 ){
where = where + "LEAF";
}
// query operator
else{
// Continue parsing the tree
for ( int i = 0; i < t.getChildCount(); i++ ) {
where = printWhere((CommonTree)t.getChild(i), where ) + "QO";
}
}
//---------------------
return where;
}