【2024考研】题解19 | #按之字形顺序打印二叉树#

按之字形顺序打印二叉树

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

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
#include <algorithm>
#include <queue>
#include <vector>
class Solution {
public:
    /**
     * @param pRoot TreeNode类 
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > Print(TreeNode* pRoot) {
        // write code here
        vector<vector<int>> ans;
        //特例为空
        if(pRoot == NULL) return ans;

        TreeNode *head = pRoot;
        queue<TreeNode*> q;
        q.push(head);

        TreeNode *now;
        bool flag = true;//第一次循环为奇数

        while (!q.empty()) {
            vector<int> row;
            int n = q.size();

            flag = !flag;//每循环一次 奇变偶 偶变奇

            for(int i = 0; i < n; i++){
                now = q.front();
                q.pop();
                row.push_back(now->val);

                if(now->left) q.push(now->left);
                if(now->right) q.push(now->right);
            }
            //奇数行翻转,偶数行不变
            if(flag) reverse(row.begin(), row.end());

            ans.push_back(row);
        
        }
        return ans;
        //总体是在层序遍历上利用flag区别开——奇数行|偶数行
    }
};

算法思想:

-1 使用队列进行层序遍历,同时使用一个flag来标记当前层是奇数行还是偶数行。

-2 在每一层的遍历过程中,将节点的值存入当前行的vector中,并将其左右子节点加入队列。

-3 如果当前层是奇数行,则将当前行的vector翻转。

-4 将每一行的vector加入结果数组中。

-4 最后返回结果数组。

时间复杂度:

O(n),其中n是二叉树的节点个数。需要遍历每个节点一次。

空间复杂度:

O(k),其中k是最大的一层节点个数。需要使用一个队列来存储层序遍历的节点,以及一个二维数组来存储结果。

2024考研数据结构 文章被收录于专栏

本人考研刷算法题,立此专栏练习强化。

全部评论

相关推荐

球球别再泡了:坏,我单9要了14
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务