【leetcode 968. 1028. 从先序遍历还原二叉树】解题报告[待完善...]

思路:用一个栈来管理树的层次关系,索引代表节点的深度

方法一:

    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];
    }

 

posted @ 2019-05-03 13:18  byjz  阅读(155)  评论(0编辑  收藏  举报