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

按之字形顺序打印二叉树

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

数据结构 双端队列 C++
一端受限的队列无法解决反向输出问题,那就双端嘛。思路同层次遍历一样,用r来记录当前层最后一个入队节点,时间复杂度为O(n),n为树的节点数;空间复杂度为O(n)。

vector<vector<int> > Print(TreeNode* pRoot) {
        TreeNode* r = pRoot; //层次遍历,记录当前层最后一个入队节点
        deque<TreeNode*> q;//双端队列
        vector<vector<int>> ans;
        if(pRoot==NULL)
            return ans;
        q.push_front(pRoot);
        vector<int> floor; //每层节点值的集合
        for(int i=0;!q.empty();){
            TreeNode* tmp;
            if(i%2==0){
                tmp=q.front();
                floor.push_back(tmp->val);
                if(tmp->left!=NULL)
                    q.push_back(tmp->left);
                if(tmp->right!=NULL)
                    q.push_back(tmp->right);
                q.pop_front();
                if(r==tmp){ //扫描到本层最后一个
                    ans.push_back(floor);
                    floor.clear();
                    r=q.front();
                    i++;
                }
            }
            else{
                tmp=q.back(); 
                floor.push_back(tmp->val);
                if(tmp->right!=NULL)
                    q.push_front(tmp->right);
                if(tmp->left!=NULL)
                    q.push_front(tmp->left);
                q.pop_back();
                if(r==tmp){
                    ans.push_back(floor);
                    floor.clear();
                    r=q.back();
                    i++;
                }
            }

        }
        return ans;
    }
全部评论

相关推荐

07-09 19:25
门头沟学院 Java
这是要把每一个投校招的都开盒吗?
26届之耻将大局逆转:裁人的时候一次性追回餐费
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-10 12:10
点赞 评论 收藏
分享
fRank1e:吓得我不敢去外包了,但是目前也只有外包这一个实习,我还要继续去吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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