JZ32 从上往下打印二叉树

96 阅读1分钟

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

描述

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

数据范围:

0<=节点总数<=1000

-1000<=节点值<=1000

示例1

输入: {8,6,10,#,#,2,1}

返回值: [8,6,10,2,1]

示例2

输入: {5,4,#,3,#,2,#,1}

返回值: [5,4,3,2,1]

方法一:层次遍历(推荐使用)

思路:

二叉树的层次遍历就是按照从上到下每行,然后每行中从左到右依次遍历,得到的二叉树的元素值。对于层次遍历,我们通常会使用队列来辅助:

因为队列是一种先进先出的数据结构,我们依照它的性质,如果从左到右访问完一行节点,并在访问的时候依次把它们的子节点加入队列,那么它们的子节点也是从左到右的次序,且排在本行节点的后面,因此队列中出现的顺序正好也是从左到右,正好符合层次遍历的特点。

具体做法:

  • step 1:首先判断二叉树是否为空,空树没有遍历结果。
  • step 2:建立辅助队列,根节点首先进入队列。不管层次怎么访问,根节点一定是第一个,那它肯定排在队伍的最前面。
  • step 3:每次遍历队首节点,如果它们有子节点,依次加入队列排队等待访问。

图示:

图片说明

c++实现代码

class Solution {
public:
    vector<int> PrintFromTopToBottom(TreeNode* root) {
        vector<int> res;
        if(root == NULL)
            //如果是空,则直接返回空vector
            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;
    }
};