题目描述:
我们从二叉树的根节点 root 开始进行深度优先搜索。
在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为 D,则其直接子节点的深度为 D + 1。根节点的深度为 0)。
如果节点只有一个子节点,那么保证该子节点为左子节点。
给出遍历输出 S,还原树并返回其根节点 root。
示例 1:
emm这不算困难题吧,把字符串分割,将其节点和对应的深度分别保存,如果当前的深度为3那么我们需要从list中找深度为2的,看其left是否为空,不为空那么就赋值为右子树,因为是先序遍历所以不会出现覆盖的情况。
代码:
class Solution {
public TreeNode recoverFromPreorder(String S) {
if(null == S || S.length() == 0){
return null;
}
int start = 0;
int getfirst = S.indexOf("-");
if(getfirst == -1){
TreeNode root = new TreeNode(Integer.valueOf(S));
root.left = null;
root.right = null;
return root;
}
TreeNode root = new TreeNode(Integer.valueOf(S.substring(0, getfirst)));
root.left = null;
root.right = null;
List<TreeNode> listnode = new ArrayList<>();
List<Integer> listdeep = new ArrayList<>();
listdeep.add(0);
listnode.add(root);
char [] tem = S.toCharArray();
for (int i = getfirst; i < tem.length;) {
int j = i;
while (j < tem.length && tem[j] == '-') {
j ++;
}
// 得到深度
int num = j - i;
int temj = j;
// 得到节点的值
while (temj < tem.length && tem[temj] != '-') {
temj ++;
}
i = temj;
int value = Integer.valueOf(S.substring(j, temj));
TreeNode temnode = new TreeNode(value);
temnode.left = null;
temnode.right = null;
int getindex = listdeep.size() - 1;
for (; getindex >= 0; getindex --) {
if(listdeep.get(getindex) == num - 1){
break;
}
}
TreeNode node = listnode.get(getindex);
if(node.left == null){
node.left = temnode;
}else {
node.right = temnode;
}
listdeep.add(num);
listnode.add(temnode);
}
return root;
}
}