JZ32 从上往下打印二叉树

133 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情

Day27 2023/02/03

题目链接

难度:简单

题目

不分行从上往下打印出二叉树的每个节点,同层节点从左至右打印。例如输入{8,6,10,#,#,2,1},如以下图中的示例二叉树,则依次打印8,6,10,2,1(空节点不打印,跳过),请你将打印的结果存放到一个数组里面,返回。

数据范围:

0<=节点总数<=1000

-1000<=节点值<=1000

示例

输入:{8,6,10,#,#,2,1}
返回值:[8,6,10,2,1]

思路


本题考查的是二叉树的层序遍历(即从上到下,从左到右),我们可以通过队列来辅助完成这一操作。按照队列先进先出的原则,从左向右依次遍历一行节点,并在访问的时候依次将他们的子节点加入辅助队列(包括将节点数据存入数组中,用做返回值),最终队列中的顺序刚好就是二叉树层序遍历的顺序。

具体步骤:

  1. 首先做二叉树的判空操作,若为空则返回空数组。
  2. 建立一个辅助队列,从二叉树的根节点开始按照层序遍历的规则开始遍历,首次将根节点的数据存入数组中。
  3. 从根节点开始,每次遍历都判断该节点是否存在左右节点若存在则存入辅助队列。

知识点


  • 队列是一种操作受限的数据结构,仅允许在队头删除元素,对位插入元素,并遵从节点的先进先出原则。

算法实现


c++代码实现-层序遍历(辅助队列)

class Solution {
  public:
    vector<int> PrintFromTopToBottom(TreeNode* root) {
        vector<int> res;
        if (!root)
            //如果是空,则直接返回空数组
            return res;
        //队列存储,进行层次遍历
        queue<TreeNode*> q;
        q.push(root); //无论怎样首先存入根节点
        TreeNode* cur; //中间节点,用来暂存节点
        while (!q.empty()) {
            cur = q.front();
            q.pop();
            res.push_back(cur->val); //存入节点数据
            //若是左右孩子存在,则存入左右孩子作为下一个层次
            if (cur->left)
                q.push(cur->left); //先存左孩子
            if (cur->right)
                q.push(cur->right); //在存右孩子
        }
        return res;
    }
};
  • 时间复杂度 O(n)O(n) --- 遍历二叉树的所有节点,n为二叉树的节点数
  • 空间复杂度 O(n)O(n) --- 每次存储二叉树一层的节点数,最坏情况下存储n个节点

总结

  • 除了使用辅助队列的方式实现二叉树的层序遍历,还可以使用递归的方式。