从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1 主要思路:
考点:二叉树的横向遍历。
注意点:
1)根节点root的判断。每次都会忘记根节点的判断问题,这属于树是否为一个空树的问题。
2)如何进行横向遍历?
二叉树的横向遍历从根节点开始,在每一层使用队列保存本层的节点的所有子节点,在下次循环时访问,当然在下次循环时也要保存其子节点。
3)如何实现打印本层节点?
因为上层保存的节点(也就是本层节点)在队列中,到本层也要将孩子节点保存在同一队列中,那么应该如何区分?在上层保存节点的队列,可以获取得到队列内节点指针的个数size,可以通过for循环来访问上层保存的节点(也就是本层的所有节点)、保存本层的孩子节点。
/**
* 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) {
queue<TreeNode*> queue1;//保存节点,使用TreeNode的指针队列
vector<vector<int>> v;//保存最后的打印
vector<int> sub_v;//保存每层节点的值
if(!root) return v;//对根节点进行判断
queue1.push(root);//将根节点入队,之后开始每层每层的访问。此处也就是初始化。
while(!queue1.empty()){//停止条件:队列为空,说明已经对整棵树访问完毕
sub_v.clear();//使用的总是同一个容器,每次都要清空
for(int size=queue1.size(); size>0; --size){//获取上次保存的节点个数,也就是本层节点个数,最终的跳出条件是size=0不满足
TreeNode* p = queue1.front();//对于整个队列获取值
queue1.pop();//并出队
sub_v.push_back(p->val);//临时打印
if(p->left) queue1.push(p->left);//保存左右节点
if(p->right) queue1.push(p->right);
}
v.push_back(sub_v); //考虑到在while中已经判断过其不能为空,因此sub_v也就不会为空
}
return v;
}
};
报错之处:
1)Line 25: Char 36: runtime error: member access within misaligned address 0xbebebebebebebebe
for type 'TreeNode', which requires 8 byte alignment (solution.cpp) 0xbebebebebebebebe: note:
pointer points here <memory cannot be printed> SUMMARY: UndefinedBehaviorSanitizer: undefined-
behavior prog_joined.cpp:35:36
这个错误表示发生了指针为空但是还强行访问的情况。也就是越界访问了,仔细检查后发现for语句中判别条件中size>=0,也就是说当队列中没有节点size=0,还要再访问一次。
2)括号检查:括号多【低级】
3)考虑使用递归方法做:但是最终返回值一直是空,感觉是没有真正写到vector中,但是使用的是引用。【还没明白】