剑指 32_2 分行从上到下打印二叉树【广度优先遍历】【层序遍历】

65 篇文章 1 订阅

剑指 32_2 分行从上到下打印二叉树

全部刷题与学习记录

【C++刷题学习笔记目录】

【C++百万并发网络通信-笔记目录】

原题目

题目地址:剑指 Offer 32 - II. 从上到下打印二叉树 II

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

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

[
  [3],
  [9,20],
  [15,7]
]

考查知识点

层序遍历、广度优先遍历

忘记层序遍历的话,先看这一篇最基础的层序遍历 剑指 32 从上到下打印二叉树【宽度/广度优先遍历】【BFS】

参考:深度优先遍历(DFS)和广度优先遍历(BFS)


自己的第一遍解法

一开始想错了,被简单的例子限制思路,以为二维数组中的一维数组就是当前节点curNode的两个子节点,没有考虑一层中有多套子节点的情况。上一个错误代码:

class Solution_01 {//失败,将一个根节点的两个子节点当成一个数组,没有实现一层有两套子节点时的数组拼接
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        if (root == nullptr)
            return vector<vector<int>> {};

        deque<TreeNode*> dNode = {root};
        vector<vector<int>> res = {{root->val},};

        while (!dNode.empty())
        {
            TreeNode* curNode = dNode.front();
            dNode.pop_front();

            vector<int> tmpRes = {};
            if (curNode->left)
            {
                dNode.push_back(curNode->left);
                tmpRes.push_back(curNode->left->val);
            }
            if (curNode->right)
            {
                dNode.push_back(curNode->right);
                tmpRes.push_back(curNode->right->val);
            }
            if (!tmpRes.empty())
                res.push_back(tmpRes);
        }
        return res;
    }
};

好的解法

这一题就是在层序遍历的基础上,要知道每一层的节点数量nextLevel和当前层还要存储的节点toBeOut。这样才能结束一个一维数组(当前层节点全部存储完毕),进入下一个一维数组(开始存储下一层的节点)

class Solution {
 public:
     vector<vector<int>> levelOrder(TreeNode* root) {
         if (root == nullptr)
             return vector<vector<int>> {};

         deque<TreeNode*> dNode = {root};
         vector<vector<int>> res;

         int nextlevel = 0;//下一层的节点数量
         int toBeOut = 1;//本层剩余要输出的节点数量
         vector<int> tmpRes = {};//保存本层的节点数值
         while (!dNode.empty())
         {
             TreeNode* curNode = dNode.front();
             tmpRes.push_back(curNode->val);
             dNode.pop_front();
             toBeOut--;//处理完当前节点
             if (curNode->left)
             {
                 dNode.push_back(curNode->left);
                 nextlevel++;//确认:下一层要处理一个节点
             }
             if (curNode->right)
             {
                 dNode.push_back(curNode->right);
                 nextlevel++;
             }

             if (toBeOut == 0) {//当前层处理完,开始处理下一层,即开始保存新的一维数组
                 res.push_back(tmpRes);
                 tmpRes = {};
                 toBeOut = nextlevel;
                 nextlevel = 0;
             }
         }
         return res;
     }
 };

测试代码放在下面:

int main()
{
    Solution so;
    TreeNode x1(1), x2(2), x3(3), x4(4), x5(5);
    x1.left = &x2; x1.right = &x3;
    x2.left = &x4; x3.right = &x5;

    vector<vector<int>> res = so.levelOrder(&x1);
    for( auto bigE: res)
    {
        for( auto smallE: bigE)
            cout << smallE << " ";
        cout << endl;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值