题解 | #二叉树的之字形层序遍历#

二叉树的之字形层序遍历

http://www.nowcoder.com/practice/47e1687126fa461e8a3aff8632aa5559

//算法思想:利用队列思想层次遍历,front是队头指针,rear是队列尾指针,last为二叉树每层最右结点下标,depth用来记录层并判断怎么把元素放入队列中,
//1.每次front<rear时进入循环,否则返回结果
//2.先使用depth判断元素是从左向右还是从右向左进队列,
//3.然后在将而二叉树入队列
继续执行1
class Solution {
public:
    /**
     *
     * @param root TreeNode类
     * @return int整型vector<vector<>>
     */
    
    vector<vector<int> > zigzagLevelOrder(TreeNode* root) {
        if(root == NULL)
            return {};
        else{
                vector<TreeNode*> s;
                vector<vector<int>> t;
                int depth=0,front=-1,rear=-1,last=0;
                s.emplace_back(root);
                rear++;
                while(front < last)
                {
                    if(depth%2 == 0)
                    {
                        int f=front;  //临时变量
                        t.resize(depth+1);
                        //将元素入队列,从左向右
                        while(f<last)
                        {
                            f++;
                            t[depth].emplace_back(s[f]->val);
                        }
                        //将树节点入队列
                        while(front < last)
                        {
                            front++;
                            if(s[front]->left)
                            {
                                s.emplace_back(s[front]->left);
                                rear++;
                            }
                            if(s[front]->right)
                            {    
                                s.emplace_back(s[front]->right);
                                rear++;
                            }
                        }
                        last=rear;  //二叉树最右结点
                    }
                    else
                    {
                        int f=front;
                        int l=last;
                        t.resize(depth+1);
                        //将元素入队列,从右向左
                        for(int i=last;i>front;i--)
                            t[depth].emplace_back(s[i]->val);
                        //将树节点入队列
                        while(front<last)
                        {
                            front++;
                            if(s[front]->left)
                            {
                                s.emplace_back(s[front]->left);
                                rear++;
                            }
                            if(s[front]->right)
                            {    
                                s.emplace_back(s[front]->right);
                                rear++;
                            }
                        }
                    }
                    last=rear; //last指向最右结点下标
                    depth++;  //深度+1
                }
            return t;
            }    
    }
};
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务