题解 | #按之字形顺序打印二叉树#[C++递归]

按之字形顺序打印二叉树

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

  • 本质BFS,可以使用递归实现,使用vector保存每一层的nodes。
  • 但需要注意之字形相邻层顺序相反,所以用一个标志位实现。
  • 另外,使用std::reverse_iterator实现逆向遍历vector,也可以使用std::reverse函数。
/*
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> > rtVec;
        if(!pRoot) return rtVec;
        vector<TreeNode*> nodes;
        nodes.push_back(pRoot);
        PrintCore(rtVec, nodes, true);
        return rtVec;
    }
    // rtVec, in/out, save the output result
    // nodes, in, nodes of current layers
    // l2r, in, if the output/loop order is from left to right
    void PrintCore(vector<vector<int> > &rtVec, vector<TreeNode*> nodes, bool l2r){
        if(0 == nodes.size()) return;
        vector<TreeNode*> subNodes;
        vector<int> vCurLayer;
        vector<TreeNode*>::reverse_iterator it;
        for(it = nodes.rbegin(); it != nodes.rend(); it++){
            vCurLayer.push_back((*it)->val);
            if(l2r){
                if((*it)->left) subNodes.push_back((*it)->left);
                if((*it)->right) subNodes.push_back((*it)->right);
            }else{
                if((*it)->right) subNodes.push_back((*it)->right);
                if((*it)->left) subNodes.push_back((*it)->left);
            }
        }
        rtVec.push_back(vCurLayer);
        PrintCore(rtVec, subNodes, !l2r);
    }
};
全部评论

相关推荐

重生我想学测开:嵌入式的问题,我准备入行京东外卖了
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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