题目地址:
https://leetcode.com/problems/recover-a-tree-from-preorder-traversal/description/
给定一棵二叉树的前序遍历字符串
s
s
s,其规则为,每个节点的值前面跟若干个'-'
,个数为该节点所在的深度(树根深度规定为
0
0
0)。要求将其恢复为二叉树。题目保证如果某个节点只有一个孩子,必为左孩子。
可以用栈模拟整个过程。截取形如"---x"
类型的子串,看一下
x
x
x所在深度,如果深度小于等于栈元素个数则pop,然后看一下栈是否空,如果空则说明
x
x
x是树根,new出来push进去;如果非空,看一下栈顶是否有左孩子,无左孩子则优先append左孩子;否则append右孩子。代码如下:
class Solution {
public:
TreeNode* recoverFromPreorder(string s) {
vector<TreeNode*> stk;
for (int i = 0; i < s.size(); i++) {
int j = i;
while (j < s.size() && s[j] == '-') j++;
int dep = j - i;
while (stk.size() > dep) stk.pop_back();
i = j;
while (j < s.size() && isdigit(s[j])) j++;
auto x = new TreeNode(stoi(s.substr(i, j - i)));
if (stk.size())
(!stk.back()->left ? stk.back()->left : stk.back()->right) = x;
stk.push_back(x);
i = j - 1;
}
return stk.front();
}
};
时间复杂度 O ( l s ) O(l_s) O(ls),空间 O ( h ) O(h) O(h), h h h为树高。