思路:用一個棧來管理樹的層次關係,索引表明節點的深度node
方法一:spa
TreeNode* recoverFromPreorder(string S) { /* 由題意知,最上層節點深度爲0(數字前面0條橫線),而第二層節點前有1條橫線,表示深度爲1 樹的前序遍歷: 根-左-右 所以, */ if (S.empty()) return nullptr; vector<TreeNode*> stack; // 結果棧 for(int i=0,depth=0,val=0;i<S.size();) { for(depth=0;i<S.size()&&S[i]=='-';++i) // 計算節點的深度 depth++; for(val=0;i<S.size()&&S[i]!='-';++i) // 計算數值 val=val*10+S[i]-'0'; while (stack.size()>depth) // 若當前棧的長度(樹的高度)大於節點的深度,則能夠把棧中最後幾個節點pop掉(這些節點各已經成爲完整的子樹,能夠pop掉了) stack.pop_back(); TreeNode* node=new TreeNode(val); // 新建節點用於存放當前深度的結點 if (!stack.empty()) // 節點間關聯 { if (!stack.back()->left) stack.back()->left=node; else if(!stack.back()->right) stack.back()->right=node; } stack.push_back(node); } return stack[0]; }