题目
给你二叉树的根节点 root
,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
示例 2:
输入:root = [1]
输出:[[1]]
示例 3:
输入:root = []
输出:[]
提示:
- 树中节点数目在范围
[0, 2000]
内 -
解题方法
迭代法
使用队列保存每一层的节点,当前层节点出队列后将该节点下一层的左右节点依次入队列。
时间复杂度O(n)
,空间复杂度O(n)
C++代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> result; queue<TreeNode*> nodes; if(root != nullptr) nodes.push(root); while(nodes.size()>0) { vector<int> level; int size = nodes.size(); for(int i=0; i<size; i++) { TreeNode* tmp = nodes.front(); nodes.pop(); level.push_back(tmp->val); if(tmp->left != nullptr) nodes.push(tmp->left); if(tmp->right != nullptr) nodes.push(tmp->right); } result.push_back(level); } return result; } };
递归法
记录层深,递归的处理每个节点。
时间复杂度O(n)
,空间复杂度O(n)
C++代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: void level(TreeNode *cur, vector<vector<int>>& result, int depth) { if(cur == nullptr) return; if(result.size()==depth) result.push_back(vector<int>()); result[depth].push_back(cur->val); level(cur->left, result, depth+1); level(cur->right, result, depth+1); } vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> result; int depth = 0; level(root, result, depth); return result; } };