欢迎来到王正伟的博客

返回顶部

面试题32 - II: 从上到下打印二叉树(C++)

题目地址:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof/

题目描述

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

题目示例

例如:
给定二叉树: [3,9,20,null,null,15,7],

     3
   /   \
   9    20
    /   \
     15  7
返回其层次遍历结果:

[
[3],
[9,20],
[15,7]
]

解题思路

分析题目发现二叉树是按层遍历输出节点,在二叉树问题中,最常见的就是深度优先搜索和广度优先搜索,而本题是典型的广度优先搜索问题,对于广度优先搜索,我们采用队列解决。在本题中,我们需要设置一个数组arr用于存储每一层节点的数目。

程序源码

/**
 * 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) {
        if(root == nullptr) return {};
        vector<vector<int>> res;
        TreeNode* p = root; //每层最后一个节点
        queue<TreeNode*> q;
        q.push(root);
        vector<int> arr; //存储每层节点
        while(!q.empty())
        {
            TreeNode* node = q.front();
            arr.push_back(node->val);
            q.pop();
            if(node->left != nullptr) q.push(node->left);
            if(node->right != nullptr) q.push(node->right);
            if(node == p)
            {
                p = q.back(); //p指向下一层最后一个节点
                res.push_back(arr); //保存该层节点
                arr.clear(); //清空数组存储下一层节点
            }
        }
        return res;
    }
};

上述代码修改—双百操作

/**
 * 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) {
        if(root == nullptr) return {};
        vector<vector<int>> res;
        queue<TreeNode*> q;
        q.push(root);
        while(!q.empty())
        {
            vector<int> arr; //存储每层节点
            int q_len = q.size();
            for(int i = 0; i < q_len; i++)
            {
                TreeNode* node = q.front();
                q.pop();
                arr.push_back(node->val);
                if(node->left != nullptr) q.push(node->left);
                if(node->right != nullptr) q.push(node->right);
            }
            res.push_back(arr);
        }
        return res;
    }
};
posted @ 2020-05-12 18:53  Mr.King~  阅读(233)  评论(0编辑  收藏  举报