一、题目描述:102. 二叉树的层次遍历(中等)
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],3
/ \
9 20
/ \
15 7
返回其层次遍历结果:[
[3],
[9,20],
[15,7]
]来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
方法一
1、创建一个队列,以及一个变量count_now记录当前层还剩多少个节点,count_next记录下一层有多少个节点,头节点入队,count_now初始化为1.
2、进入循环,当队列长度不为空,从队列取出队列头节点,头节点左右子节点入队(不为空)同时count_next累加记录下一层的节点个数。当前层节点个数count_now减一,并且将节点的数字加入到存储数组中。
当count_now == 0的时候说明当前层已经取完节点。此时将存储数组保存后将存储数组清空(array_all.push_back(array),array.clear()),同时更新count_now = count_next,count_next = 0;进入下一层循环。
方法二、
算法
最简单的解法就是递归,首先确认树非空,然后调用递归函数 helper(node, level),参数是当前节点和节点的层次。程序过程如下:
输出列表称为 levels,当前最高层数就是列表的长度 len(levels)。比较访问节点所在的层次 level 和当前最高层次 len(levels) 的大小,如果前者更大就向 levels 添加一个空列表。
将当前节点插入到对应层的列表 levels[level] 中。
递归非空的孩子节点:helper(node.left / node.right, level + 1)。
三、代码
方法一
/**
* 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>> save;
if(root == NULL)
return save;
deque<TreeNode * > dp;
int count_next = 0;
int count_now = 0;
dp.push_back(root);
count_now ++ ;
vector<int> save_tmp;
while(dp.size() > 0)
{
TreeNode * t = *dp.begin();
if(t->left != NULL)
{
dp.push_back(t->left);
count_next++;
}
if(t->right != NULL)
{
dp.push_back(t->right);
count_next ++ ;
}
save_tmp.push_back(t->val);
dp.pop_front();
count_now--;
if(count_now == 0)
{
count_now = count_next;
save.push_back(save_tmp);
save_tmp.clear();
count_next = 0;
}
}
return save;
}
};