所有題目源代碼: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)