【leetcode 968. 1028. 從先序遍歷還原二叉樹】解題報告[待完善...]

思路:用一個棧來管理樹的層次關係,索引表明節點的深度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];
    }
相關文章
相關標籤/搜索