题解 | #JZ77 按之字形顺序打印二叉树#

按之字形顺序打印二叉树

http://www.nowcoder.com/practice/91b69814117f4e8097390d107d2efbe0

//反向遍历每层时保存下一层

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    vector<vector<int> > Print(TreeNode* pRoot) {
        vector<vector<int>> retVec;
        if (!pRoot) return retVec;
        
        vector<TreeNode *> nextLevelNodes, curLevelNodes;
        vector<int> curLevelVec;
        bool ltor = true;
        
        curLevelNodes.push_back(pRoot);
        
        while (curLevelNodes.size()) {
            curLevelVec.clear();
            for (vector<TreeNode*>::reverse_iterator it = curLevelNodes.rbegin(); it!=curLevelNodes.rend(); ++it) {    //反向遍历当前层,按方向保存下一层
                if (ltor && (*it)->left) nextLevelNodes.push_back((*it)->left);    //左右方向则先保存左
                if ((*it)->right) nextLevelNodes.push_back((*it)->right);
                if (!ltor && (*it)->left) nextLevelNodes.push_back((*it)->left);    //右左方向则先保存右
                curLevelVec.push_back((*it)->val);    //依次当前层所有值
            }
            if (!curLevelVec.empty()) retVec.push_back(curLevelVec);    //当前层值非空则保存
            ltor = !ltor;    //方向调整
            curLevelNodes = nextLevelNodes;  //下一层赋予当前层
            nextLevelNodes.clear();    //清除下层容器
        }
        
        return retVec; 
        
/*        vector<vector<int>> retVec;
        if (!pRoot) return retVec;
        
        bool ltor = true;
        queue<TreeNode*> nodes;
        
        nodes.push(pRoot);
        
        while (nodes.size()) {
            int size = nodes.size();
            vector<int> vec;
            
            while (size--) {
                TreeNode *node = nodes.front();
                
                nodes.pop();
                vec.push_back(node->val);
                
                if (ltor && node->left) nodes.push(node->left);
                if (node->right) nodes.push(node->right);
                if (!ltor && node->left) nodes.push(node->left);
            }
            
            if (vec.size()) retVec.push_back(vec);    //保存该层值
            
            ltor = !ltor;    //调整方向
            if (nodes.size()) { //调整方向
                vector<TreeNode *> tmpNodes;
                while (nodes.size()) {
                    tmpNodes.push_back(nodes.front()); 
                    nodes.pop();
                }
                for (auto it=tmpNodes.rbegin(); it!=tmpNodes.rend(); ++it)
                    nodes.push(*it);
            }
        }
        
        return retVec; */
    }
    
};
全部评论

相关推荐

01-14 12:34
门头沟学院 C++
牛马人的牛马人生:太暖心了啊 配环境是真烦
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务