题目
我们从二叉树的根节点 root 开始进行深度优先搜索。
在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为 D,则其直接子节点的深度为 D + 1。根节点的深度为 0)。
如果节点只有一个子节点,那么保证该子节点为左子节点。
给出遍历输出 S,还原树并返回其根节点 root。
题目链接:link.
分析
又是一个二叉树相关的题目,如果写了前天的题目,这道题应该比较容易。本题给出一个字符串,返回根节点即可。观察给出的字符串,很容易看出,第一层数字前面有一个横线,第二层前面有两个横线…所以我们只要算出每个数字前面的下划线就能判断处数字所在层数。
同时,由于使用递归,要设置一个全局变量来保存字符串,在函数里面也要更新字符串
题解
递归
public class T1028 {
public static String s = ""; // 全局变量保存字符串
public static void main(String[] args){
System.out.println(recoverFromPreorder(s));
}
public static TreeNode recoverFromPreorder(String str) {
s = str;
if(s == null || s.equals("") ) return null;
int i=0;
while(s.length()>=i+1 && s.charAt(i)>='0' && s.charAt(i)<='9'){ // 计算数字的数量
i++;
}
TreeNode root = new TreeNode(Integer.parseInt(s.substring(0,i))); // 根节点
s = s.substring(i);
root.left = recoverFromPreorder(0); // 分别得到左节点和右节点
root.right = recoverFromPreorder(0);
return root;
}
public static TreeNode recoverFromPreorder(int count){
if(s == null || s.equals("") ) return null;
for (int i = 0; i < count+1; i++) {
if(s.charAt(i) != '-') return null;
}
s = s.substring(count+1); // 更新字符串
int i=0;
while(s.length()>=i+1 && s.charAt(i)>='0' && s.charAt(i)<='9'){ // 计算数字的数量
i++;
}
TreeNode node = new TreeNode(Integer.parseInt(s.substring(0,i))); // 节点
s = s.substring(i);
node.left = recoverFromPreorder(count+1); // 递归
node.right = recoverFromPreorder(count+1);
return node;
}
}
总结
这个题用递归不是最好的解法,可以用栈来保存信息,迭代就可以完成,有兴趣可以试试。