美文网首页
剑指offer 33- 之字形打印二叉树

剑指offer 33- 之字形打印二叉树

作者: 顾子豪 | 来源:发表于2021-05-21 11:19 被阅读0次

    请实现一个函数按照之字形顺序从上向下打印二叉树。

    即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
    样例

    输入如下图所示二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null]
        8
       / \
      12  2
         / \
        6   4
    输出:[[8], [2, 12], [6, 4]]
    

    分析:
    (BFS) O(n)

    在上一道题《分行从上往下打印二叉树》 的基础上修改代码。

    增加一个行号标记i,偶数行直接reverse一下
    时间复杂度分析:每个点遍历一次,所以时间复杂度是 O(n)

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        vector<vector<int>> printFromTopToBottom(TreeNode* root) {
            vector<vector<int>> res;//二维数组用于存放结果元素
            queue<TreeNode*> q;//定义一个队列来模拟BFS
            if(!root) return res;//根元素为空,什么也不做,直接返回res
            q.push(root);//把根节点放入队列中
            int i = 1; //i用来记录行号
            q.push(nullptr);//NULL作为行末尾标记
            
            vector<int> cur;// cur用来存放当前行的元素
            while(q.size()) {//队列中只要还有元素就进行操作
                auto x = q.front();//访问队首元素
                q.pop();//删掉队首元素
                if(x) {//x为true,说明该行还有元素需要操作
                    cur.push_back(x->val);// 当前元素存入cur中
                    if(x->left) q.push(x->left);//将左儿子放入队列中
                    if(x->right) q.push(x->right);//将右儿子放入队列中
                } else {//x为false,说明已经访问行尾标志NULL
                    if (q.size()) q.push(nullptr);//行元素已经在队列中了,这是增加新的行标记NULL
                    if(i % 2 == 0) reverse(cur.begin(), cur.end()); //偶数行的元素翻转一下
                    res.push_back(cur); //把当前行的元素存放在结果数组中
                    cur.clear();//把当前行的元素清空
                    i++;// 当前行完成,行号加1
                }
            }
            
            return res;
        }
    }
    

    相关文章

      网友评论

          本文标题:剑指offer 33- 之字形打印二叉树

          本文链接:https://www.haomeiwen.com/subject/awzljltx.html