面试题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; } };
-----------------------------------
心之所向,素履所往;生如逆旅,一苇以航。
------------------------------------------