剑指32-1 从上到下打印二叉树

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

 

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

3
/ \
9 20
/ \
15 7
返回:

[3,9,20,15,7]

 

因为是要从上到下,所以要求先进先出,先压入的一层就要先输出,所以采用队列。

从第一层开始,先输出根节点的值,然后将左右子树压入队列(如果不为空)。

之后每一层,先记录下来队列的长度,即为这一层节点的数量,然后挨个弹出,对该层每个节点都输出值,然后压入左右子树(如果不为空)。因为已经提前记录了这一层节点数量,不会输出到下一层去。

注意处理根节点为空的情况。

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     vector<int> levelOrder(TreeNode* root) {
13         if(root==nullptr)
14             return {};
15         queue<TreeNode*> q;
16         vector<int> ret;
17         ret.push_back(root->val);
18         if(root->left!=nullptr)
19             q.push(root->left);
20         if(root->right!=nullptr)
21             q.push(root->right);
22         while(!q.empty()){
23             int cur_size=q.size();
24             while(cur_size!=0){
25                 TreeNode* curptr=q.front();
26                 q.pop();
27                 cur_size--;
28                 ret.push_back(curptr->val);
29                 if(curptr->left!=nullptr)
30                     q.push(curptr->left);
31                 if(curptr->right!=nullptr)
32                     q.push(curptr->right);
33             }
34         }
35         return ret;
36     }
37 };

 经过思考发现,记录每一层数量其实完全是白用功,因为本题不用分层输出,直接顺序到下一层完全没影响。

posted @ 2020-07-04 12:06  __rookie  阅读(108)  评论(0编辑  收藏  举报