leetcode1028. 从先序遍历还原二叉树
我们从二叉树的根节点 root 开始进行深度优先搜索。
在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为 D,则其直接子节点的深度为 D + 1。根节点的深度为 0)。
如果节点只有一个子节点,那么保证该子节点为左子节点。
给出遍历输出 S,还原树并返回其根节点 root。
示例 1:
输入:“1-2–3--4-5–6--7”
输出:[1,2,5,3,4,6,7]
递归解法
从左到右按顺序遍历字符串,递归终止条件是深度。如果当前层的深度小于等于上一层,呢么就返回null。
class Solution {
public TreeNode recoverFromPreorder(String S) {
int start = 0;
//查找数字
for (; start < S.length(); start++) {
if (S.charAt(start) == '-') {
break;
}
}
String ss = S.substring(0,start);
//System.out.println(ss);
TreeNode root = new TreeNode(Integer.valueOf(ss));
//index每次位置是数字的位置,1-2--3,这一步让index在0位置
index = start - 1;
root.left = fun(S,0);
root.right = fun(S,0);
return root;
}
private int index = 0;//index记录坐标
public TreeNode fun(String s,int depth) {
int c = getNextDepth(s,index);
if (c <= depth || index > s.length() - 1) return null;
//更新depth,在数字位置上面,而不是'-'。对于1-2--3,index这时应该在2位置
index += (c +1);
//查找数字
int a = index;
for (; a < s.length(); a++) {
if (s.charAt(a) == '-') {
break;
}
}
String ns = s.substring(index,a);
//System.out.println("ns = "+ns+" index = "+index+" a = "+a);
int num = Integer.valueOf(ns);
TreeNode now = new TreeNode(num);
index = a - 1;
now.left = fun(s,c);
now.right = fun(s,c);
return now;
}
public int getNextDepth(String s,int ind) {
int c = 0;
for (int i = ind + 1; i < s.length(); i++) {
if (s.charAt(i) == '-') {
c++;
} else {
break;
}
}
return c;
}
}
u1s1,一遍就过了,这道题hard给高了。
leetcode 112