leetcode1028. 从先序遍历还原二叉树

leetcode1028. 从先序遍历还原二叉树

六月 26, 2020

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。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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