题目描述
输入二叉树字符串,如“a{b{d{g,},e{,f}},c{,h{i,j{k,l}}}}”,节点都是以小写字母表示,请按照中序遍历的顺序输出。
思考
根据题目描述,可以将解决问题的过程分为两个步骤,首先解析字符串转存为树,然后就是实现中序遍历。
那么首先开始解析字符串。
public String[] parseToTree(String str) {
/**
* 思路:这里以数组存储树结构,左子节点为2*i+1,右子节点为2*i+2,这里不做详细解析;
* 这里重要的是注意三个字符“{”,“,”和“}”,当看见左花括号,那么下一个字母必为上一个
* 字母的左子节点,而看见逗号,那么下一个字母必是右子节点,而遍历到右花括号时,应当
* 将下标回退到父节点。
*/
String[] tree = new String[60];
int index = 0;
for (int i=0;i<str.length();i++) {
String c = str.substring(i, i + 1);
if (c.matches("[a-z]"))
//字母写入数组
tree[index] = c;
else if (c.equals("{"))
//左子节点,下标指向左子节点位置
index = 2*index+1;
else if (c.equals(","))
//右子节点,下标指向右子节点位置
index ++;
else if (c.equals("}"))
//回退,退到父节点的位置
index = index/2-1;
}
return tree;
}
解析字符串解决了,接下来解决中序遍历的问题。
//首先使用递归实现,这里就很容易理解了
public String inorderRecurrent(String[] tree,int i) {
String c = "";
if (i >= tree.size())
return c;
//获取值
c = tree[i];
//按照左中右的顺序
return inorderRecurrent(tree,2*i+1) + c + inorderRecurrent(tree,2*i+2);
}
这样就基本可以解决这个问题了,但是当字符串变长时,这里的数组长度就得重新定义,而且递归遍历是耗费存储空间的,所以这里先留两个坑。