所有题目源代码:Git地址
题目
我们从二叉树的根节点 root 开始进行深度优先搜索。
在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为 D,则其直接子节点的深度为 D + 1。根节点的深度为 0)。
如果节点只有一个子节点,那么保证该子节点为左子节点。
给出遍历输出 S,还原树并返回其根节点 root。
示例 1:
输入:"1-2--3--4-5--6--7"
输出:[1,2,5,3,4,6,7]
示例 2:
`
输入:"1-2--3---4-5--6---7"
输出:[1,2,5,3,null,6,null,4,null,7]
示例 3:
输入:"1-401--349---90--88"
输出:[1,401,null,349,88,90]
提示:
原始树中的节点数介于 1 和 1000 之间。
每个节点的值介于 1 和 10 ^ 9 之间。
方案:树的前序遍历的模拟
- 模拟树的先序遍历即可,代码非最简,仍然可简化,但是效率还是比较高的,用时2ms,超过100%
class Solution {
String str;
int strIndex = 0;
int depth = 0;
TreeNode root;
public TreeNode recoverFromPreorder(String S) {
str = S;
int val=0;
while (strIndex<str.length()&&str.charAt(strIndex) != '-') {
val = val*10+str.charAt(strIndex)-'0';
strIndex++;
}
root = new TreeNode(val);
root.left = new TreeNode(-1);
if (!buildTree(1, root.left)) root.left = null;
root.right = new TreeNode(-1);
if (!buildTree(1, root.right))root.right=null;
return root;
}
public boolean buildTree(int dep, TreeNode node) {
while (strIndex<str.length()&&str.charAt(strIndex) == '-') {
depth++;
strIndex++;
}
if (depth == dep) {
int val = 0;
while (strIndex<str.length()&&str.charAt(strIndex) != '-') {
val = val*10+str.charAt(strIndex)-'0';
strIndex++;
}
node.val = val;
depth = 0;
node.left = new TreeNode(-1);
if (!buildTree(dep + 1, node.left)) node.left=null;
node.right = new TreeNode(-1);
if (!buildTree(dep + 1, node.right))node.right=null;
}else{return false;}
return true;
}
}
复杂度计算
- 时间复杂度:O(n),考虑String的遍历
- 空间复杂度:O(n)