题目为 我们从二叉树的根节点 root 开始进行深度优先搜索。
在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为 D,则其直接子节点的深度为 D + 1。根节点的深度为 0)。
如果节点只有一个子节点,那么保证该子节点为左子节点。
给出遍历输出 S,还原树并返回其根节点 root。
题目就是将一个深度遍历转换成广度遍历,只不过层级需要按照“-”符号的数量判断。用堆stack后进先出,一个stack存储之前的树,另一个stack存储之前的树对应的层级。
public TreeNode recoverFromPreorder(String S)
{
S = S + "-";
TreeNode begin = null;
Stack<TreeNode> q = new Stack<TreeNode>();
Stack<int> qLevel = new Stack<int>();
int countBefore = 0;
int countDe = 0;
string sAppend = "";
TreeNode trFather = null;
for (int i = 0; i < S.Length; i++)
{
//追加数字
if (S[i]!='-')
{
sAppend += S[i];
}
else
{
//之前存在数字
if (!string.IsNullOrEmpty(sAppend))
{
if (countBefore>countDe)
{
while (countBefore+1 != countDe)
{
trFather= q.Pop();
countBefore= qLevel.Pop();
}
}
else if (countBefore<countDe)
{
trFather = q.Peek();
qLevel.Peek();
}
TreeNode detail = new TreeNode(int.Parse(sAppend));
if (countBefore == 0&&countDe==0)
{
begin = detail;
}
else
{
if (trFather.left == null)
{
trFather.left = detail;
}
else
{
trFather.right = detail;
}
}
q.Push(detail);
qLevel.Push(countDe);
countBefore = countDe;
sAppend = "";
countDe = 0;
}
countDe++;
while (i < S.Length-1&& S[i + 1] =='-')
{
i++;
countDe++;
}
}
}
return begin;
}