剑指offer day6

100 阅读1分钟

刷题计划(第6天)

时间:2022.4.21

题数:3

题目类型:搜索与回溯算法

1. 从上到下打印二叉树

利用队列来实现层次遍历

class Solution {
public:
    vector<int> levelOrder(TreeNode* root) {//根据函数返回值定义存储结果的变量
        vector<int> result;
        // 定义一个队列用于存储节点的数据 
        queue<TreeNode*> que;
        if(root != NULL) que.push(root);
        while(!que.empty()) {
            /* 计算队列的大小也即有多少个孩子 */
            for(int i = 0; i < que.size(); i++) {
                /* 获取第一个节点数据 */
                TreeNode* node = que.front();
                que.pop();
                result.push_back(node->val);
                if(node->left != NULL) que.push(node->left);
                if(node->right != NULL) que.push(node->right);

            }
        }
        return result;
    }
};

image.png

2.从上到下打印二叉树 II

从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。

image.png

直接拿上一题的代码修改,变成二维数组,然后在循环当中vector一个tmp,

/**
 * 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>> levelOrder(TreeNode* root) {
        vector<vector<int>> result;
        queue<TreeNode*> que;
        if(root != NULL) que.push(root);
        while(!que.empty()) {
            int size=que.size();
            vector<int> tmp;
            for(int i = 0; i < size; i++) {
                /* 获取第一个节点数据 */
                TreeNode* node = que.front();
                que.pop();
                tmp.push_back(node->val);
                if(node->left != NULL) que.push(node->left);
                if(node->right != NULL) que.push(node->right);

            }
            result.push_back(tmp);
        }
        return result;
    }
};

image.png

和上体遍历原理类似,但这个题是easy,上个题是mid

3. 从上到下打印二叉树 III

请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

今天的题好无聊i

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        if(root == NULL) return {};
        vector<vector<int>> result;
        queue<TreeNode*> que;
        bool flag=true;
        if(root != NULL) que.push(root);
        while(!que.empty()) {
            int size=que.size();
            vector<int> tmp;
            for(int i = 0; i < size; i++) {
                /* 获取第一个节点数据 */
                TreeNode* node = que.front();
                que.pop();
                tmp.push_back(node->val);
                if(node->left != NULL) que.push(node->left);
                if(node->right != NULL) que.push(node->right);
            }
            if (flag){
                result.push_back(tmp);
                flag = false;
            }else{
                reverse(tmp.begin(),tmp.end());
                result.push_back(tmp);
                flag=true;
            }           
        }
        return result;
    }
};

image.png

总结

从上到下打印二叉树(1),(2),(3)