【剑指offer】【C++】32 - II. 从上到下打印二叉树 II

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

 

例如:
给定二叉树: [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中,但是使用的是引用。【还没明白】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值