Leetcode 解题报告 剑指 Offer 32 从上到下打印二叉树系列

剑指 Offer 32 从上到下打印二叉树系列

    • 剑指 Offer 32 - I. 从上到下打印二叉树
    • 剑指 Offer 32 - II. 从上到下打印二叉树 II
    • 剑指 Offer 32 - III. 从上到下打印二叉树 III

剑指 Offer 32 - I. 从上到下打印二叉树

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

例如:

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

    3
   / \
  9  20
    /  \
   15   7

返回:

[3,9,20,15,7]

题解:

这就是一道简单的BFS

/**
 * 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<int> levelOrder(TreeNode* root) {
     
        vector<int> ans;
        if(root==nullptr)
            return ans;
        queue<TreeNode*> q;
        q.push(root);
        while(!q.empty()){
     			//BFS模板
            TreeNode *temp=q.front();
            q.pop();
            ans.push_back(temp->val);
            if(temp->left!=nullptr)
                q.push(temp->left);
            if(temp->right!=nullptr)
                q.push(temp->right);
        }
        return ans;

    }
};

剑指 Offer 32 - II. 从上到下打印二叉树 II

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

例如:

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

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

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

题解:

之前的博客,遍历都是通过Visit()函数来打印在控制台的,这个题目虽说是简单的BFS层序遍历,但要求将每层的数据单独分类,比较有意思。这里用二维数组。

/**
 * 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>> ans;
        if(root==nullptr)
            return ans;
        queue<TreeNode*> q;
        q.push(root);
        while(!q.empty()){
     					//BFS模板里面嵌套了每层的操作
            vector<int> t;
            for(int i=q.size();i>0;--i){
     
                TreeNode *temp=q.front();
                q.pop();
                t.push_back(temp->val);
                if(temp->left)
                    q.push(temp->left);
                if(temp->right)
                    q.push(temp->right);
            }
            ans.push_back(t);
        }
        return ans;
    }
};

剑指 Offer 32 - III. 从上到下打印二叉树 III

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

例如:

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

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

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

题解:

这里用到了deque双端队列

/**
 * 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>> ans;
        if(root==nullptr)
            return ans;
        deque<TreeNode*> q;
        q.push_back(root);
        bool flag=true;
        while(!q.empty()){
     					//BFS模板里面嵌套了每层的操作
            vector<int> t;
            for(int i=q.size();i>0;--i){
     
                if(flag){
     
                    TreeNode *temp=q.front();
                    q.pop_front();
                    t.push_back(temp->val);
                    if(temp->left!=nullptr)
                        q.push_back(temp->left);
                    if(temp->right!=nullptr)
                        q.push_back(temp->right);
                }else{
     
                    TreeNode *temp=q.back();
                    q.pop_back();
                    t.push_back(temp->val);
                    if(temp->right!=nullptr)
                        q.push_front(temp->right);
                    if(temp->left!=nullptr)
                        q.push_front(temp->left);
                }
            }
            flag=!flag;
            ans.push_back(t);
        }
        return ans;
    }
};

你可能感兴趣的:(手撕数据结构与算法,二叉树,bfs,算法,面试,leetcode)